diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2019-07-31 17:50:24 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2019-07-31 17:50:24 (GMT) |
commit | de0c57b4383a4d7ced5058c2c50580a0f4ba5477 (patch) | |
tree | ed9f83c4262ccc3cd22a3cf8ad5ad18f197f7d63 /tcl8.6/pkgs/itcl4.1.1/generic | |
parent | 4f9885152c6e8eef1a01e2cc50fa4e3db8bbcb5c (diff) | |
download | blt-de0c57b4383a4d7ced5058c2c50580a0f4ba5477.zip blt-de0c57b4383a4d7ced5058c2c50580a0f4ba5477.tar.gz blt-de0c57b4383a4d7ced5058c2c50580a0f4ba5477.tar.bz2 |
upgrade tcl/tk 8.6.10
Diffstat (limited to 'tcl8.6/pkgs/itcl4.1.1/generic')
33 files changed, 0 insertions, 37079 deletions
diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/clientData b/tcl8.6/pkgs/itcl4.1.1/generic/clientData deleted file mode 100644 index 62e3f3c..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/clientData +++ /dev/null @@ -1,16 +0,0 @@ -itcl2TclOO.c: framePtr->clientData = NULL; -itcl2TclOO.c: framePtr->objc = objc; -itcl2TclOO.c: framePtr->objv = objv; -itcl2TclOO.c: framePtr->procPtr = procPtr; -itcl2TclOO.c: if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { -itcl2TclOO.c: contextPtr = framePtr->clientData; -itcl2TclOO.c: if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { -itclMigrate2TclCore.c: framePtr->isProcCallFrame |= FRAME_HAS_RESOLVER; -itclMigrate2TclCore.c: framePtr->resolvePtr = resolvePtr; -itclMigrate2TclCore.c: framePtr = framePtr->callerVarPtr; -itclMigrate2TclCore.c: framePtr = framePtr->callerVarPtr; -itclMigrate2TclCore.c: return (Tcl_Namespace *)framePtr->nsPtr; -itclMigrate2TclCore.c: return framePtr->clientData; -itclMigrate2TclCore.c: ((Interp *)interp)->framePtr->nsPtr = (Namespace *)nsPtr; -itclMigrate2TclCore.c: return ((Interp *)interp)->framePtr->objc; -itclMigrate2TclCore.c: return ((Interp *)interp)->framePtr->objv; diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itcl.decls b/tcl8.6/pkgs/itcl4.1.1/generic/itcl.decls deleted file mode 100644 index 1530464..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itcl.decls +++ /dev/null @@ -1,621 +0,0 @@ -# -*- tcl -*- - -# public API -library itcl -interface itcl -hooks {itclInt} -epoch 0 -scspec ITCLAPI - -# Declare each of the functions in the public Tcl interface. Note that -# the an index should never be reused for a different function in order -# to preserve backwards compatibility. - -declare 2 { - int Itcl_RegisterC(Tcl_Interp *interp, const char *name, - Tcl_CmdProc *proc, ClientData clientData, - Tcl_CmdDeleteProc *deleteProc) -} -declare 3 { - int Itcl_RegisterObjC(Tcl_Interp *interp, const char *name, - Tcl_ObjCmdProc *proc, ClientData clientData, - Tcl_CmdDeleteProc *deleteProc) -} -declare 4 { - int Itcl_FindC(Tcl_Interp *interp, const char *name, - Tcl_CmdProc **argProcPtr, Tcl_ObjCmdProc **objProcPtr, - ClientData *cDataPtr) -} -declare 5 { - void Itcl_InitStack(Itcl_Stack *stack) -} -declare 6 { - void Itcl_DeleteStack(Itcl_Stack *stack) -} -declare 7 { - void Itcl_PushStack(ClientData cdata, Itcl_Stack *stack) -} -declare 8 { - ClientData Itcl_PopStack(Itcl_Stack *stack) -} -declare 9 { - ClientData Itcl_PeekStack(Itcl_Stack *stack) -} -declare 10 { - ClientData Itcl_GetStackValue(Itcl_Stack *stack, int pos) -} -declare 11 { - void Itcl_InitList(Itcl_List *listPtr) -} -declare 12 { - void Itcl_DeleteList(Itcl_List *listPtr) -} -declare 13 { - Itcl_ListElem *Itcl_CreateListElem(Itcl_List *listPtr) -} -declare 14 { - Itcl_ListElem *Itcl_DeleteListElem(Itcl_ListElem *elemPtr) -} -declare 15 { - Itcl_ListElem *Itcl_InsertList(Itcl_List *listPtr, ClientData val) -} -declare 16 { - Itcl_ListElem *Itcl_InsertListElem(Itcl_ListElem *pos, ClientData val) -} -declare 17 { - Itcl_ListElem *Itcl_AppendList(Itcl_List *listPtr, ClientData val) -} -declare 18 { - Itcl_ListElem *Itcl_AppendListElem(Itcl_ListElem *pos, ClientData val) -} -declare 19 { - void Itcl_SetListValue(Itcl_ListElem *elemPtr, ClientData val) -} -declare 20 { - void Itcl_EventuallyFree(ClientData cdata, Tcl_FreeProc *fproc) -} -declare 21 { - void Itcl_PreserveData(ClientData cdata) -} -declare 22 { - void Itcl_ReleaseData(ClientData cdata) -} -declare 23 { - Itcl_InterpState Itcl_SaveInterpState(Tcl_Interp *interp, int status) -} -declare 24 { - int Itcl_RestoreInterpState(Tcl_Interp *interp, Itcl_InterpState state) -} -declare 25 { - void Itcl_DiscardInterpState(Itcl_InterpState state) -} - - -# private API -interface itclInt -# -# Functions used within the package, but not considered "public" -# - -declare 0 { - int Itcl_IsClassNamespace(Tcl_Namespace *namesp) -} -declare 1 { - int Itcl_IsClass(Tcl_Command cmd) -} -declare 2 { - ItclClass *Itcl_FindClass(Tcl_Interp *interp, const char *path, int autoload) -} -declare 3 { - int Itcl_FindObject(Tcl_Interp *interp, const char *name, ItclObject **roPtr) -} -declare 4 { - int Itcl_IsObject(Tcl_Command cmd) -} -declare 5 { - int Itcl_ObjectIsa(ItclObject *contextObj, ItclClass *cdefn) -} -declare 6 { - int Itcl_Protection(Tcl_Interp *interp, int newLevel) -} -declare 7 { - const char *Itcl_ProtectionStr(int pLevel) -} -declare 8 { - int Itcl_CanAccess(ItclMemberFunc *memberPtr, Tcl_Namespace *fromNsPtr) -} -declare 9 { - int Itcl_CanAccessFunc(ItclMemberFunc *mfunc, Tcl_Namespace *fromNsPtr) -} -declare 11 { - void Itcl_ParseNamespPath(const char *name, Tcl_DString *buffer, - const char **head, const char **tail) -} -declare 12 { - int Itcl_DecodeScopedCommand(Tcl_Interp *interp, const char *name, - Tcl_Namespace **rNsPtr, char **rCmdPtr) -} -declare 13 { - int Itcl_EvalArgs(Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) -} -declare 14 { - Tcl_Obj *Itcl_CreateArgs(Tcl_Interp *interp, const char *string, - int objc, Tcl_Obj *const objv[]) -} -declare 17 { - int Itcl_GetContext(Tcl_Interp *interp, ItclClass **iclsPtrPtr, - ItclObject **ioPtrPtr) -} -declare 18 { - void Itcl_InitHierIter(ItclHierIter *iter, ItclClass *iclsPtr) -} -declare 19 { - void Itcl_DeleteHierIter(ItclHierIter *iter) -} -declare 20 { - ItclClass *Itcl_AdvanceHierIter(ItclHierIter *iter) -} -declare 21 { - int Itcl_FindClassesCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 22 { - int Itcl_FindObjectsCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 24 { - int Itcl_DelClassCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 25 { - int Itcl_DelObjectCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 26 { - int Itcl_ScopeCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 27 { - int Itcl_CodeCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 28 { - int Itcl_StubCreateCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 29 { - int Itcl_StubExistsCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 30 { - int Itcl_IsStub(Tcl_Command cmd) -} - - -# -# Functions for manipulating classes -# - -declare 31 { - int Itcl_CreateClass(Tcl_Interp *interp, const char *path, - ItclObjectInfo *info, ItclClass **rPtr) -} -declare 32 { - int Itcl_DeleteClass(Tcl_Interp *interp, ItclClass *iclsPtr) -} -declare 33 { - Tcl_Namespace *Itcl_FindClassNamespace(Tcl_Interp *interp, const char *path) -} -declare 34 { - int Itcl_HandleClass(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 38 { - void Itcl_BuildVirtualTables(ItclClass *iclsPtr) -} -declare 39 { - int Itcl_CreateVariable(Tcl_Interp *interp, ItclClass *iclsPtr, - Tcl_Obj *name, char *init, char *config, ItclVariable **ivPtr) -} -declare 40 { - void Itcl_DeleteVariable(char *cdata) -} -declare 41 { - const char *Itcl_GetCommonVar(Tcl_Interp *interp, const char *name, - ItclClass *contextClass) -} - - -# -# Functions for manipulating objects -# - -declare 44 { - int Itcl_CreateObject(Tcl_Interp *interp, const char* name, ItclClass *iclsPtr, - int objc, Tcl_Obj *const objv[], ItclObject **rioPtr) -} -declare 45 { - int Itcl_DeleteObject(Tcl_Interp *interp, ItclObject *contextObj) -} -declare 46 { - int Itcl_DestructObject(Tcl_Interp *interp, ItclObject *contextObj, - int flags) -} -declare 48 { - const char *Itcl_GetInstanceVar(Tcl_Interp *interp, const char *name, - ItclObject *contextIoPtr, ItclClass *contextIclsPtr) -} - -# -# Functions for manipulating methods and procs -# - -declare 50 { - int Itcl_BodyCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 51 { - int Itcl_ConfigBodyCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 52 { - int Itcl_CreateMethod(Tcl_Interp *interp, ItclClass *iclsPtr, - Tcl_Obj *namePtr, const char *arglist, const char *body) -} -declare 53 { - int Itcl_CreateProc(Tcl_Interp *interp, ItclClass *iclsPtr, - Tcl_Obj *namePtr, const char *arglist, const char *body) -} -declare 54 { - int Itcl_CreateMemberFunc(Tcl_Interp *interp, ItclClass *iclsPtr, - Tcl_Obj *name, const char *arglist, const char *body, - ItclMemberFunc **mfuncPtr) -} -declare 55 { - int Itcl_ChangeMemberFunc(Tcl_Interp *interp, ItclMemberFunc *mfunc, - const char *arglist, const char *body) -} -declare 56 { - void Itcl_DeleteMemberFunc(char *cdata) -} -declare 57 { - int Itcl_CreateMemberCode(Tcl_Interp *interp, ItclClass *iclsPtr, \ - const char *arglist, const char *body, ItclMemberCode **mcodePtr) -} -declare 58 { - void Itcl_DeleteMemberCode(char *cdata) -} -declare 59 { - int Itcl_GetMemberCode(Tcl_Interp *interp, ItclMemberFunc *mfunc) -} -declare 61 { - int Itcl_EvalMemberCode(Tcl_Interp *interp, ItclMemberFunc *mfunc, - ItclObject *contextObj, int objc, Tcl_Obj *const objv[]) -} -declare 67 { - void Itcl_GetMemberFuncUsage(ItclMemberFunc *mfunc, - ItclObject *contextObj, Tcl_Obj *objPtr) -} -declare 68 { - int Itcl_ExecMethod(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 69 { - int Itcl_ExecProc(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 71 { - int Itcl_ConstructBase(Tcl_Interp *interp, ItclObject *contextObj, - ItclClass *contextClass) -} -declare 72 { - int Itcl_InvokeMethodIfExists(Tcl_Interp *interp, const char *name, - ItclClass *contextClass, ItclObject *contextObj, int objc, - Tcl_Obj *const objv[]) -} -declare 74 { - int Itcl_ReportFuncErrors(Tcl_Interp *interp, ItclMemberFunc *mfunc, - ItclObject *contextObj, int result) -} - - -# -# Commands for parsing class definitions -# - -declare 75 { - int Itcl_ParseInit(Tcl_Interp *interp, ItclObjectInfo *info) -} -declare 76 { - int Itcl_ClassCmd(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 77 { - int Itcl_ClassInheritCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 78 { - int Itcl_ClassProtectionCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 79 { - int Itcl_ClassConstructorCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 80 { - int Itcl_ClassDestructorCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 81 { - int Itcl_ClassMethodCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 82 { - int Itcl_ClassProcCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 83 { - int Itcl_ClassVariableCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 84 { - int Itcl_ClassCommonCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 85 { - int Itcl_ParseVarResolver(Tcl_Interp *interp, const char *name, - Tcl_Namespace *contextNs, int flags, Tcl_Var *rPtr) -} - -# -# Commands in the "builtin" namespace -# - -declare 86 { - int Itcl_BiInit(Tcl_Interp *interp, ItclObjectInfo *infoPtr) -} -declare 87 { - int Itcl_InstallBiMethods(Tcl_Interp *interp, ItclClass *cdefn) -} -declare 88 { - int Itcl_BiIsaCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 89 { - int Itcl_BiConfigureCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 90 { - int Itcl_BiCgetCmd(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 91 { - int Itcl_BiChainCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 92 { - int Itcl_BiInfoClassCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 93 { - int Itcl_BiInfoInheritCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 94 { - int Itcl_BiInfoHeritageCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 95 { - int Itcl_BiInfoFunctionCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 96 { - int Itcl_BiInfoVariableCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 97 { - int Itcl_BiInfoBodyCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 98 { - int Itcl_BiInfoArgsCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -#declare 99 { -# int Itcl_DefaultInfoCmd(ClientData dummy, Tcl_Interp *interp, int objc, -# Tcl_Obj *const objv[]) -#} - - -# -# Ensembles -# - -declare 100 { - int Itcl_EnsembleInit(Tcl_Interp *interp) -} -declare 101 { - int Itcl_CreateEnsemble(Tcl_Interp *interp, const char *ensName) -} -declare 102 { - int Itcl_AddEnsemblePart(Tcl_Interp *interp, const char *ensName, - const char *partName, const char *usageInfo, Tcl_ObjCmdProc *objProc, - ClientData clientData, Tcl_CmdDeleteProc *deleteProc) -} -declare 103 { - int Itcl_GetEnsemblePart(Tcl_Interp *interp, const char *ensName, - const char *partName, Tcl_CmdInfo *infoPtr) -} -declare 104 { - int Itcl_IsEnsemble(Tcl_CmdInfo *infoPtr) -} -declare 105 { - int Itcl_GetEnsembleUsage(Tcl_Interp *interp, const char *ensName, - Tcl_Obj *objPtr) -} -declare 106 { - int Itcl_GetEnsembleUsageForObj(Tcl_Interp *interp, Tcl_Obj *ensObjPtr, - Tcl_Obj *objPtr) -} -declare 107 { - int Itcl_EnsembleCmd(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 108 { - int Itcl_EnsPartCmd(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 109 { - int Itcl_EnsembleErrorCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 115 { - void Itcl_Assert(const char *testExpr, const char *fileName, int lineNum) -} -declare 116 { - int Itcl_IsObjectCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 117 { - int Itcl_IsClassCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} - -# -# new commands to use TclOO functionality -# - -declare 140 { - int Itcl_FilterAddCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 141 { - int Itcl_FilterDeleteCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 142 { - int Itcl_ForwardAddCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 143 { - int Itcl_ForwardDeleteCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 144 { - int Itcl_MixinAddCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 145 { - int Itcl_MixinDeleteCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} - -# -# Helper commands -# - -#declare 150 { -# int Itcl_BiInfoCmd(ClientData clientData, Tcl_Interp *interp, int objc, -# Tcl_Obj *const objv[]) -#} -declare 151 { - int Itcl_BiInfoUnknownCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 152 { - int Itcl_BiInfoVarsCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 153 { - int Itcl_CanAccess2(ItclClass *iclsPtr, int protection, - Tcl_Namespace *fromNsPtr) -} -declare 160 { - int Itcl_SetCallFrameResolver(Tcl_Interp *interp, - Tcl_Resolve *resolvePtr) -} -declare 161 { - int ItclEnsembleSubCmd(ClientData clientData, Tcl_Interp *interp, - const char *ensembleName, int objc, Tcl_Obj *const *objv, - const char *functionName) -} -declare 162 { - Tcl_Namespace *Itcl_GetUplevelNamespace(Tcl_Interp *interp, int level) -} -declare 163 { - ClientData Itcl_GetCallFrameClientData(Tcl_Interp *interp) -} -declare 165 { - int Itcl_SetCallFrameNamespace(Tcl_Interp *interp, Tcl_Namespace *nsPtr) -} -declare 166 { - int Itcl_GetCallFrameObjc(Tcl_Interp *interp) -} -declare 167 { - Tcl_Obj *const *Itcl_GetCallFrameObjv(Tcl_Interp *interp) -} -declare 168 { - int Itcl_NWidgetCmd(ClientData infoPtr, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 169 { - int Itcl_AddOptionCmd(ClientData infoPtr, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 170 { - int Itcl_AddComponentCmd(ClientData infoPtr, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 171 { - int Itcl_BiInfoOptionCmd(ClientData dummy, Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]) -} -declare 172 { - int Itcl_BiInfoComponentCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]) -} -declare 173 { - int Itcl_RenameCommand(Tcl_Interp *interp, const char *oldName, - const char *newName) -} -declare 174 { - int Itcl_PushCallFrame(Tcl_Interp *interp, Tcl_CallFrame *framePtr, - Tcl_Namespace *nsPtr, int isProcCallFrame) -} -declare 175 { - void Itcl_PopCallFrame(Tcl_Interp *interp) -} -declare 176 { - Tcl_CallFrame *Itcl_GetUplevelCallFrame(Tcl_Interp *interp, - int level) -} -declare 177 { - Tcl_CallFrame *Itcl_ActivateCallFrame(Tcl_Interp *interp, - Tcl_CallFrame *framePtr) -} -declare 178 { - const char* ItclSetInstanceVar(Tcl_Interp *interp, - const char *name, const char *name2, const char *value, - ItclObject *contextIoPtr, ItclClass *contextIclsPtr) -} -declare 179 { - Tcl_Obj * ItclCapitalize(const char *str) -} -declare 180 { - int ItclClassBaseCmd(ClientData clientData, Tcl_Interp *interp, - int flags, int objc, Tcl_Obj *const objv[], ItclClass **iclsPtrPtr) -} -declare 181 { - int ItclCreateComponent(Tcl_Interp *interp, ItclClass *iclsPtr, - Tcl_Obj *componentPtr, int type, ItclComponent **icPtrPtr) -} -declare 182 { - void Itcl_SetContext(Tcl_Interp *interp, ItclObject *ioPtr) -} -declare 183 { - void Itcl_UnsetContext(Tcl_Interp *interp) -} -declare 184 { - const char * ItclGetInstanceVar(Tcl_Interp *interp, const char *name, - const char *name2, ItclObject *ioPtr, ItclClass *iclsPtr) -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itcl.h b/tcl8.6/pkgs/itcl4.1.1/generic/itcl.h deleted file mode 100644 index 23a84a6..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itcl.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * itcl.h -- - * - * This file contains definitions for the C-implemeted part of a Itcl - * this version of [incr Tcl] (Itcl) is a completely new implementation - * based on TclOO extension of Tcl 8.5 - * It tries to provide the same interfaces as the original implementation - * of Michael J. McLennan - * Some small pieces of code are taken from that implementation - * - * Copyright (c) 2007 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * ADDING [incr Tcl] TO A Tcl-BASED APPLICATION: - * - * To add [incr Tcl] facilities to a Tcl application, modify the - * Tcl_AppInit() routine as follows: - * - * 1) Include this header file near the top of the file containing - * Tcl_AppInit(): - * - * #include "itcl.h" -* - * 2) Within the body of Tcl_AppInit(), add the following lines: - * - * if (Itcl_Init(interp) == TCL_ERROR) { - * return TCL_ERROR; - * } - * - * 3) Link your application with libitcl.a - * - * NOTE: An example file "tclAppInit.c" containing the changes shown - * above is included in this distribution. - * - *--------------------------------------------------------------------- - */ - -#ifndef ITCL_H_INCLUDED -#define ITCL_H_INCLUDED - -#include <tcl.h> - -#if (TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION < 6) -# error Itcl 4 build requires tcl.h from Tcl 8.6 or later -#endif - -/* - * For C++ compilers, use extern "C" - */ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef TCL_ALPHA_RELEASE -# define TCL_ALPHA_RELEASE 0 -#endif -#ifndef TCL_BETA_RELEASE -# define TCL_BETA_RELEASE 1 -#endif -#ifndef TCL_FINAL_RELEASE -# define TCL_FINAL_RELEASE 2 -#endif - -#define ITCL_MAJOR_VERSION 4 -#define ITCL_MINOR_VERSION 1 -#define ITCL_RELEASE_LEVEL TCL_FINAL_RELEASE -#define ITCL_RELEASE_SERIAL 1 - -#define ITCL_VERSION "4.1" -#define ITCL_PATCH_LEVEL "4.1.1" - - -/* - * A special definition used to allow this header file to be included from - * windows resource files so that they can obtain version information. - * RC_INVOKED is defined by default by the windows RC tool. - * - * Resource compilers don't like all the C stuff, like typedefs and function - * declarations, that occur below, so block them out. - */ - -#ifndef RC_INVOKED - -#define ITCL_NAMESPACE "::itcl" - -#ifndef ITCLAPI -# if defined(BUILD_itcl) -# define ITCLAPI MODULE_SCOPE -# else -# define ITCLAPI extern -# undef USE_ITCL_STUBS -# define USE_ITCL_STUBS 1 -# endif -#endif - -#if defined(BUILD_itcl) && !defined(STATIC_BUILD) -# define ITCL_EXTERN extern DLLEXPORT -#else -# define ITCL_EXTERN extern -#endif - -ITCL_EXTERN int Itcl_Init(Tcl_Interp *interp); -ITCL_EXTERN int Itcl_SafeInit(Tcl_Interp *interp); - -/* - * Protection levels: - * - * ITCL_PUBLIC - accessible from any namespace - * ITCL_PROTECTED - accessible from namespace that imports in "protected" mode - * ITCL_PRIVATE - accessible only within the namespace that contains it - */ -#define ITCL_PUBLIC 1 -#define ITCL_PROTECTED 2 -#define ITCL_PRIVATE 3 -#define ITCL_DEFAULT_PROTECT 4 - -/* - * Generic stack. - */ -typedef struct Itcl_Stack { - ClientData *values; /* values on stack */ - int len; /* number of values on stack */ - int max; /* maximum size of stack */ - ClientData space[5]; /* initial space for stack data */ -} Itcl_Stack; - -#define Itcl_GetStackSize(stackPtr) ((stackPtr)->len) - -/* - * Generic linked list. - */ -struct Itcl_List; -typedef struct Itcl_ListElem { - struct Itcl_List* owner; /* list containing this element */ - ClientData value; /* value associated with this element */ - struct Itcl_ListElem *prev; /* previous element in linked list */ - struct Itcl_ListElem *next; /* next element in linked list */ -} Itcl_ListElem; - -typedef struct Itcl_List { - int validate; /* validation stamp */ - int num; /* number of elements */ - struct Itcl_ListElem *head; /* previous element in linked list */ - struct Itcl_ListElem *tail; /* next element in linked list */ -} Itcl_List; - -#define Itcl_FirstListElem(listPtr) ((listPtr)->head) -#define Itcl_LastListElem(listPtr) ((listPtr)->tail) -#define Itcl_NextListElem(elemPtr) ((elemPtr)->next) -#define Itcl_PrevListElem(elemPtr) ((elemPtr)->prev) -#define Itcl_GetListLength(listPtr) ((listPtr)->num) -#define Itcl_GetListValue(elemPtr) ((elemPtr)->value) - -/* - * Token representing the state of an interpreter. - */ -typedef struct Itcl_InterpState_ *Itcl_InterpState; - - -/* - * Include all the public API, generated from itcl.decls. - */ - -#include "itclDecls.h" - -#ifdef ITCL_PRESERVE_DEBUG -#undef Itcl_PreserveData -#undef Itcl_ReleaseData -void ItclDbgPreserveData(ClientData cdata, int line, const char *file); -void ItclDbgReleaseData(ClientData cdata, int line, const char *file); -#define Itcl_PreserveData(addr) ItclDbgPreserveData(addr, __LINE__, __FILE__) -#define Itcl_ReleaseData(addr) ItclDbgReleaseData(addr, __LINE__, __FILE__) -#endif - -#endif /* RC_INVOKED */ - -/* - * end block for C++ - */ - -#ifdef __cplusplus -} -#endif - -#endif /* ITCL_H_INCLUDED */ diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.c b/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.c deleted file mode 100644 index 30ea887..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - * itcl2TclOO.c -- - * - * This file contains code to create and manage methods. - * - * Copyright (c) 2007 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include <tclInt.h> -#include <tclOOInt.h> -#include "itclInt.h" - -void * -Itcl_GetCurrentCallbackPtr( - Tcl_Interp *interp) -{ - return TOP_CB(interp); -} - -int -Itcl_NRRunCallbacks( - Tcl_Interp *interp, - void *rootPtr) -{ - return TclNRRunCallbacks(interp, TCL_OK, rootPtr); -} - -static int -CallFinalizePMCall( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Namespace *nsPtr = data[0]; - TclOO_PostCallProc *postCallProc = (TclOO_PostCallProc *)data[1]; - ClientData clientData = data[2]; - - /* - * Give the post-call callback a chance to do some cleanup. Note that at - * this point the call frame itself is invalid; it's already been popped. - */ - - return postCallProc(clientData, interp, NULL, nsPtr, result); -} - -static int -FreeCommand( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Command *cmdPtr = data[0]; - Proc *procPtr = data[1]; - - ckfree(cmdPtr); - procPtr->cmdPtr = NULL; - - return result; -} - -static int -Tcl_InvokeClassProcedureMethod( - Tcl_Interp *interp, - Tcl_Obj *namePtr, /* name of the method */ - Tcl_Namespace *nsPtr, /* namespace for calling method */ - ProcedureMethod *pmPtr, /* method type specific data */ - int objc, /* Number of arguments. */ - Tcl_Obj *const *objv) /* Arguments as actually seen. */ -{ - Proc *procPtr = pmPtr->procPtr; - CallFrame *framePtr = NULL; - CallFrame **framePtrPtr1 = &framePtr; - Tcl_CallFrame **framePtrPtr = (Tcl_CallFrame **)framePtrPtr1; - int result; - - if (procPtr->cmdPtr == NULL) { - Command *cmdPtr = ckalloc(sizeof(Command)); - - memset(cmdPtr, 0, sizeof(Command)); - cmdPtr->nsPtr = (Namespace *) nsPtr; - cmdPtr->clientData = NULL; - procPtr->cmdPtr = cmdPtr; - Tcl_NRAddCallback(interp, FreeCommand, cmdPtr, procPtr, NULL, NULL); - } - - result = TclProcCompileProc(interp, procPtr, procPtr->bodyPtr, - (Namespace *) nsPtr, "body of method", Tcl_GetString(namePtr)); - if (result != TCL_OK) { - return result; - } - /* - * Make the stack frame and fill it out with information about this call. - * This operation may fail. - */ - - - result = TclPushStackFrame(interp, framePtrPtr, nsPtr, FRAME_IS_PROC); - if (result != TCL_OK) { - return result; - } - - framePtr->clientData = NULL; - framePtr->objc = objc; - framePtr->objv = objv; - framePtr->procPtr = procPtr; - - /* - * Give the pre-call callback a chance to do some setup and, possibly, - * veto the call. - */ - - if (pmPtr->preCallProc != NULL) { - int isFinished; - - result = pmPtr->preCallProc(pmPtr->clientData, interp, NULL, - (Tcl_CallFrame *) framePtr, &isFinished); - if (isFinished || result != TCL_OK) { - Tcl_PopCallFrame(interp); - TclStackFree(interp, framePtr); - goto done; - } - } - - /* - * Now invoke the body of the method. Note that we need to take special - * action when doing unknown processing to ensure that the missing method - * name is passed as an argument. - */ - - if (pmPtr->postCallProc) { - Tcl_NRAddCallback(interp, CallFinalizePMCall, nsPtr, - (Tcl_NRPostProc *)pmPtr->postCallProc, pmPtr->clientData, NULL); - } - return TclNRInterpProcCore(interp, namePtr, 1, pmPtr->errProc); - -done: - return result; -} - -int -Itcl_InvokeProcedureMethod( - ClientData clientData, /* Pointer to some per-method context. */ - Tcl_Interp *interp, - int objc, /* Number of arguments. */ - Tcl_Obj *const *objv) /* Arguments as actually seen. */ -{ - Tcl_Namespace *nsPtr; - Method *mPtr; - - mPtr = clientData; - if (mPtr->declaringClassPtr == NULL) { - /* that is the case for typemethods */ - nsPtr = mPtr->declaringObjectPtr->namespacePtr; - } else { - nsPtr = mPtr->declaringClassPtr->thisPtr->namespacePtr; - } - - return Tcl_InvokeClassProcedureMethod(interp, mPtr->namePtr, nsPtr, - mPtr->clientData, objc, objv); -} - -static int -FreeProcedureMethod( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ProcedureMethod *pmPtr = data[0]; - ckfree(pmPtr); - return result; -} - -int -Itcl_InvokeEnsembleMethod( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, /* namespace to call the method in */ - Tcl_Obj *namePtr, /* name of the method */ - Tcl_Proc *procPtr, - int objc, /* Number of arguments. */ - Tcl_Obj *const *objv) /* Arguments as actually seen. */ -{ - ProcedureMethod *pmPtr = ckalloc(sizeof(ProcedureMethod)); - - memset(pmPtr, 0, sizeof(ProcedureMethod)); - pmPtr->version = TCLOO_PROCEDURE_METHOD_VERSION; - pmPtr->procPtr = (Proc *)procPtr; - pmPtr->flags = USE_DECLARER_NS; - - Tcl_NRAddCallback(interp, FreeProcedureMethod, pmPtr, NULL, NULL, NULL); - return Tcl_InvokeClassProcedureMethod(interp, namePtr, nsPtr, - pmPtr, objc, objv); -} - - -/* - * ---------------------------------------------------------------------- - * - * Itcl_PublicObjectCmd, Itcl_PrivateObjectCmd -- - * - * Main entry point for object invokations. The Public* and Private* - * wrapper functions are just thin wrappers around the main ObjectCmd - * function that does call chain creation, management and invokation. - * - * ---------------------------------------------------------------------- - */ - -int -Itcl_PublicObjectCmd( - ClientData clientData, - Tcl_Interp *interp, - Tcl_Class clsPtr, - int objc, - Tcl_Obj *const *objv) -{ - Tcl_Object oPtr = (Tcl_Object)clientData; - int result; - - result = TclOOInvokeObject(interp, oPtr, clsPtr, PUBLIC_METHOD, - objc, objv); - return result; -} - -/* - * ---------------------------------------------------------------------- - * - * Itcl_NewProcClassMethod -- - * - * Create a new procedure-like method for a class for Itcl. - * - * ---------------------------------------------------------------------- - */ - -Tcl_Method -Itcl_NewProcClassMethod( - Tcl_Interp *interp, /* The interpreter containing the class. */ - Tcl_Class clsPtr, /* The class to modify. */ - TclOO_PreCallProc *preCallPtr, - TclOO_PostCallProc *postCallPtr, - ProcErrorProc *errProc, - ClientData clientData, - Tcl_Obj *nameObj, /* The name of the method, which may be NULL; - * if so, up to caller to manage storage - * (e.g., because it is a constructor or - * destructor). */ - Tcl_Obj *argsObj, /* The formal argument list for the method, - * which may be NULL; if so, it is equivalent - * to an empty list. */ - Tcl_Obj *bodyObj, /* The body of the method, which must not be - * NULL. */ - ClientData *clientData2) -{ - Tcl_Method result; - - result = TclOONewProcMethodEx(interp, clsPtr, preCallPtr, postCallPtr, - errProc, clientData, nameObj, argsObj, bodyObj, - PUBLIC_METHOD | USE_DECLARER_NS, clientData2); - return result; -} - -/* - * ---------------------------------------------------------------------- - * - * Itcl_NewProcMethod -- - * - * Create a new procedure-like method for an object for Itcl. - * - * ---------------------------------------------------------------------- - */ - -Tcl_Method -Itcl_NewProcMethod( - Tcl_Interp *interp, /* The interpreter containing the object. */ - Tcl_Object oPtr, /* The object to modify. */ - TclOO_PreCallProc *preCallPtr, - TclOO_PostCallProc *postCallPtr, - ProcErrorProc *errProc, - ClientData clientData, - Tcl_Obj *nameObj, /* The name of the method, which must not be - * NULL. */ - Tcl_Obj *argsObj, /* The formal argument list for the method, - * which must not be NULL. */ - Tcl_Obj *bodyObj, /* The body of the method, which must not be - * NULL. */ - ClientData *clientData2) -{ - return TclOONewProcInstanceMethodEx(interp, oPtr, preCallPtr, postCallPtr, - errProc, clientData, nameObj, argsObj, bodyObj, - PUBLIC_METHOD | USE_DECLARER_NS, clientData2); -} - -/* - * ---------------------------------------------------------------------- - * - * Itcl_NewForwardClassMethod -- - * - * Create a new forwarded method for a class for Itcl. - * - * ---------------------------------------------------------------------- - */ - -Tcl_Method -Itcl_NewForwardClassMethod( - Tcl_Interp *interp, - Tcl_Class clsPtr, - int flags, - Tcl_Obj *nameObj, - Tcl_Obj *prefixObj) -{ - return (Tcl_Method)TclOONewForwardMethod(interp, (Class *)clsPtr, - flags, nameObj, prefixObj); -} - - -static Tcl_Obj * -Itcl_TclOOObjectName( - Tcl_Interp *interp, - Object *oPtr) -{ - Tcl_Obj *namePtr; - - if (oPtr->cachedNameObj) { - return oPtr->cachedNameObj; - } - namePtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, oPtr->command, namePtr); - Tcl_IncrRefCount(namePtr); - oPtr->cachedNameObj = namePtr; - return namePtr; -} - -int -Itcl_SelfCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - Interp *iPtr = (Interp *) interp; - CallFrame *framePtr = iPtr->varFramePtr; - CallContext *contextPtr; - - if (!Itcl_IsMethodCallFrame(interp)) { - Tcl_AppendResult(interp, TclGetString(objv[0]), - " may only be called from inside a method", NULL); - return TCL_ERROR; - } - - contextPtr = framePtr->clientData; - - if (objc == 1) { - Tcl_SetObjResult(interp, Itcl_TclOOObjectName(interp, contextPtr->oPtr)); - return TCL_OK; - } - return TCL_ERROR; -} - -int -Itcl_IsMethodCallFrame( - Tcl_Interp *interp) -{ - Interp *iPtr = (Interp *) interp; - CallFrame *framePtr = iPtr->varFramePtr; - if (framePtr == NULL || !(framePtr->isProcCallFrame & FRAME_IS_METHOD)) { - return 0; - } - return 1; -} - -/* needed as work around for problem in Tcl 8.6.2 TclOO */ -void -Itcl_IncrObjectRefCount(Tcl_Object ptr) { - Object * oPtr = (Object *) ptr; - oPtr->refCount++; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.h b/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.h deleted file mode 100644 index 4f9df0a..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itcl2TclOO.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef _TCLINT -typedef void (ProcErrorProc)(Tcl_Interp *interp, Tcl_Obj *procNameObj); -#endif - -#ifndef TCL_OO_INTERNAL_H -typedef int (TclOO_PreCallProc)(ClientData clientData, Tcl_Interp *interp, - Tcl_ObjectContext context, Tcl_CallFrame *framePtr, int *isFinished); -typedef int (TclOO_PostCallProc)(ClientData clientData, Tcl_Interp *interp, - Tcl_ObjectContext context, Tcl_Namespace *namespacePtr, int result); -#endif - -MODULE_SCOPE int Itcl_NRRunCallbacks(Tcl_Interp *interp, void *rootPtr); -MODULE_SCOPE void * Itcl_GetCurrentCallbackPtr(Tcl_Interp *interp); -MODULE_SCOPE Tcl_Method Itcl_NewProcClassMethod(Tcl_Interp *interp, Tcl_Class clsPtr, - TclOO_PreCallProc *preCallPtr, TclOO_PostCallProc *postCallPtr, - ProcErrorProc *errProc, ClientData clientData, Tcl_Obj *nameObj, - Tcl_Obj *argsObj, Tcl_Obj *bodyObj, ClientData *clientData2); -MODULE_SCOPE Tcl_Method Itcl_NewProcMethod(Tcl_Interp *interp, Tcl_Object oPtr, - TclOO_PreCallProc *preCallPtr, TclOO_PostCallProc *postCallPtr, - ProcErrorProc *errProc, ClientData clientData, Tcl_Obj *nameObj, - Tcl_Obj *argsObj, Tcl_Obj *bodyObj, ClientData *clientData2); -MODULE_SCOPE int Itcl_PublicObjectCmd(ClientData clientData, Tcl_Interp *interp, - Tcl_Class clsPtr, int objc, Tcl_Obj *const *objv); -MODULE_SCOPE Tcl_Method Itcl_NewForwardClassMethod(Tcl_Interp *interp, - Tcl_Class clsPtr, int flags, Tcl_Obj *nameObj, Tcl_Obj *prefixObj); -MODULE_SCOPE int Itcl_SelfCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const *objv); -MODULE_SCOPE int Itcl_IsMethodCallFrame(Tcl_Interp *interp); -MODULE_SCOPE int Itcl_InvokeEnsembleMethod(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - Tcl_Obj *namePtr, Tcl_Proc *procPtr, int objc, Tcl_Obj *const *objv); -MODULE_SCOPE int Itcl_InvokeProcedureMethod(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const *objv); -MODULE_SCOPE void Itcl_IncrObjectRefCount(Tcl_Object ptr); diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclBase.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclBase.c deleted file mode 100644 index 450074a..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclBase.c +++ /dev/null @@ -1,838 +0,0 @@ -/* - * itclBase.c -- - * - * This file contains the C-implemented startup part of an - * Itcl implemenatation - * - * Copyright (c) 2007 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include <stdlib.h> -#include "itclInt.h" - -static Tcl_ObjCmdProc ItclFinishCmd; -static Tcl_ObjCmdProc ItclSetHullWindowName; -static Tcl_ObjCmdProc ItclCheckSetItclHull; - -#ifdef OBJ_REF_COUNT_DEBUG -static Tcl_ObjCmdProc ItclDumpRefCountInfo; -#endif - -#ifdef ITCL_PRESERVE_DEBUG -static Tcl_ObjCmdProc ItclDumpPreserveInfo; -#endif - -MODULE_SCOPE const ItclStubs itclStubs; - -static int Initialize(Tcl_Interp *interp); - -static const char initScript[] = -"namespace eval ::itcl {\n" -" proc _find_init {} {\n" -" global env tcl_library\n" -" variable library\n" -" variable patchLevel\n" -" rename _find_init {}\n" -" if {[info exists library]} {\n" -" lappend dirs $library\n" -" } else {\n" -" set dirs {}\n" -" if {[info exists env(ITCL_LIBRARY)]} {\n" -" lappend dirs $env(ITCL_LIBRARY)\n" -" }\n" -" lappend dirs [file join [file dirname $tcl_library] itcl$patchLevel]\n" -" set bindir [file dirname [info nameofexecutable]]\n" -" lappend dirs [file join . library]\n" -" lappend dirs [file join $bindir .. lib itcl$patchLevel]\n" -" lappend dirs [file join $bindir .. library]\n" -" lappend dirs [file join $bindir .. .. library]\n" -" lappend dirs [file join $bindir .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. itcl-ng itcl library]\n" -" # On *nix, check the directories in the tcl_pkgPath\n" -" # XXX JH - this looks unnecessary, maybe Darwin only?\n" -" if {[string equal $::tcl_platform(platform) \"unix\"]} {\n" -" foreach d $::tcl_pkgPath {\n" -" lappend dirs $d\n" -" lappend dirs [file join $d itcl$patchLevel]\n" -" }\n" -" }\n" -" }\n" -" foreach i $dirs {\n" -" set library $i\n" -" if {![catch {uplevel #0 [list source [file join $i itcl.tcl]]}]} {\n" -" set library $i\n" -" return\n" -" }\n" -" }\n" -" set msg \"Can't find a usable itcl.tcl in the following directories:\n\"\n" -" append msg \" $dirs\n\"\n" -" append msg \"This probably means that Itcl/Tcl weren't installed properly.\n\"\n" -" append msg \"If you know where the Itcl library directory was installed,\n\"\n" -" append msg \"you can set the environment variable ITCL_LIBRARY to point\n\"\n" -" append msg \"to the library directory.\n\"\n" -" error $msg\n" -" }\n" -" _find_init\n" -"}"; - -/* - * The following script is used to initialize Itcl in a safe interpreter. - */ - -static const char safeInitScript[] = -"proc ::itcl::local {class name args} {\n" -" set ptr [uplevel [list $class $name] $args]\n" -" uplevel [list set itcl-local-$ptr $ptr]\n" -" set cmd [uplevel namespace which -command $ptr]\n" -" uplevel [list trace variable itcl-local-$ptr u \"::itcl::delete object $cmd; list\"]\n" -" return $ptr\n" -"}"; - -static const char *clazzClassScript = -"::oo::class create ::itcl::clazz {\n" -" superclass ::oo::class\n" -" method unknown args {\n" -" ::tailcall ::itcl::parser::handleClass [::lindex [::info level 0] 0] [self] {*}$args\n" -" }\n" -" unexport create new unknown\n" -"}"; - -#define ITCL_IS_ENSEMBLE 0x1 - -typedef struct ItclCmdsInfo { - const char *name; - int flags; -} ItclCmdsInfo; -static ItclCmdsInfo itclCmds [] = { - { "::itcl::class", 0}, - { "::itcl::find", ITCL_IS_ENSEMBLE}, - { "::itcl::delete", ITCL_IS_ENSEMBLE}, - { "::itcl::is", ITCL_IS_ENSEMBLE}, - { "::itcl::filter", ITCL_IS_ENSEMBLE}, - { "::itcl::forward", ITCL_IS_ENSEMBLE}, - { "::itcl::import::stub", ITCL_IS_ENSEMBLE}, - { "::itcl::mixin", ITCL_IS_ENSEMBLE}, - { "::itcl::parser::delegate", ITCL_IS_ENSEMBLE}, - { "::itcl::type", 0}, - { "::itcl::widget", 0}, - { "::itcl::widgetadaptor", 0}, - { "::itcl::nwidget", 0}, - { "::itcl::addoption", 0}, - { "::itcl::addobjectoption", 0}, - { "::itcl::adddelegatedoption", 0}, - { "::itcl::adddelegatedmethod", 0}, - { "::itcl::addcomponent", 0}, - { "::itcl::setcomponent", 0}, - { "::itcl::extendedclass", 0}, - { "::itcl::genericclass", 0}, - { "::itcl::parser::delegate", ITCL_IS_ENSEMBLE}, - { NULL, 0}, -}; -#ifdef ITCL_DEBUG_C_INTERFACE -extern void RegisterDebugCFunctions( Tcl_Interp * interp); -#endif - -static const Tcl_ObjectMetadataType objMDT = { - TCL_OO_METADATA_VERSION_CURRENT, - "ItclObject", - ItclDeleteObjectMetadata, /* Not really used yet */ - NULL -}; - -static Tcl_MethodCallProc RootCallProc; - -const Tcl_MethodType itclRootMethodType = { - TCL_OO_METHOD_VERSION_CURRENT, - "itcl root method", - RootCallProc, - NULL, - NULL -}; - -static int -RootCallProc( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext context, - int objc, - Tcl_Obj *const *objv) -{ - Tcl_Object oPtr = Tcl_ObjectContextObject(context); - ItclObject *ioPtr = Tcl_ObjectGetMetadata(oPtr, &objMDT); - ItclRootMethodProc *proc = (ItclRootMethodProc *)clientData; - - return (*proc)(ioPtr, interp, objc, objv); -} - -/* - * ------------------------------------------------------------------------ - * FreeItclObjectInfo() - * - * called when an interp is deleted to free up memory - * - * ------------------------------------------------------------------------ - */ -static void -FreeItclObjectInfo( - ClientData clientData) -{ - ItclObjectInfo *infoPtr; - - infoPtr = (ItclObjectInfo *)clientData; - ItclFinishCmd(infoPtr, infoPtr->interp, 0, NULL); -} - -/* - * ------------------------------------------------------------------------ - * Initialize() - * - * that is the starting point when loading the library - * it initializes all internal stuff - * - * ------------------------------------------------------------------------ - */ - -#ifdef NEW_PROTO_RESOLVER -int ItclVarsAndCommandResolveInit(Tcl_Interp *interp); -#endif - -static int -Initialize ( - Tcl_Interp *interp) -{ - Tcl_Namespace *nsPtr; - Tcl_Namespace *itclNs; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - const char * ret; - char *res_option; - int opt; - int isNew; - Tcl_Object clazzObjectPtr, root; - Tcl_Obj *objPtr; - - if (Tcl_InitStubs(interp, "8.6", 0) == NULL) { - return TCL_ERROR; - } - - ret = TclOOInitializeStubs(interp, "1.0"); - if (ret == NULL) { - return TCL_ERROR; - } - - nsPtr = Tcl_CreateNamespace(interp, ITCL_NAMESPACE, NULL, NULL); - if (nsPtr == NULL) { - Tcl_Panic("Itcl: cannot create namespace: \"%s\" \n", ITCL_NAMESPACE); - } - - nsPtr = Tcl_CreateNamespace(interp, ITCL_NAMESPACE"::internal::dicts", - NULL, NULL); - if (nsPtr == NULL) { - Tcl_Panic("Itcl: cannot create namespace: \"%s::internal::dicts\" \n", - ITCL_NAMESPACE); - } - - Tcl_CreateObjCommand(interp, ITCL_NAMESPACE"::finish", ItclFinishCmd, - NULL, NULL); - - /* for debugging only !!! */ -#ifdef OBJ_REF_COUNT_DEBUG - Tcl_CreateObjCommand(interp, - ITCL_NAMESPACE"::dumprefcountinfo", - ItclDumpRefCountInfo, NULL, NULL); -#endif - -#ifdef ITCL_PRESERVE_DEBUG - Tcl_CreateObjCommand(interp, - ITCL_NAMESPACE"::dumppreserveinfo", - ItclDumpPreserveInfo, NULL, NULL); -#endif - /* END for debugging only !!! */ - - /* - * Create the top-level data structure for tracking objects. - * Store this as "associated data" for easy access, but link - * it to the itcl namespace for ownership. - */ - infoPtr = (ItclObjectInfo*)ckalloc(sizeof(ItclObjectInfo)); - memset(infoPtr, 0, sizeof(ItclObjectInfo)); - infoPtr->interp = interp; - infoPtr->class_meta_type = (Tcl_ObjectMetadataType *)ckalloc( - sizeof(Tcl_ObjectMetadataType)); - infoPtr->class_meta_type->version = TCL_OO_METADATA_VERSION_CURRENT; - infoPtr->class_meta_type->name = "ItclClass"; - infoPtr->class_meta_type->deleteProc = ItclDeleteClassMetadata; - infoPtr->class_meta_type->cloneProc = NULL; - - infoPtr->object_meta_type = &objMDT; - - Tcl_InitHashTable(&infoPtr->objects, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&infoPtr->objectCmds, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&infoPtr->classes, TCL_ONE_WORD_KEYS); - Tcl_InitObjHashTable(&infoPtr->nameClasses); - Tcl_InitHashTable(&infoPtr->namespaceClasses, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&infoPtr->procMethods, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&infoPtr->instances, TCL_STRING_KEYS); - Tcl_InitHashTable(&infoPtr->frameContext, TCL_ONE_WORD_KEYS); - Tcl_InitObjHashTable(&infoPtr->classTypes); - infoPtr->ensembleInfo = (EnsembleInfo *)ckalloc(sizeof(EnsembleInfo)); - memset(infoPtr->ensembleInfo, 0, sizeof(EnsembleInfo)); - Tcl_InitHashTable(&infoPtr->ensembleInfo->ensembles, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&infoPtr->ensembleInfo->subEnsembles, TCL_ONE_WORD_KEYS); - infoPtr->ensembleInfo->numEnsembles = 0; - infoPtr->protection = ITCL_DEFAULT_PROTECT; - infoPtr->currClassFlags = 0; - infoPtr->buildingWidget = 0; - infoPtr->typeDestructorArgumentPtr = Tcl_NewStringObj("", -1); - Tcl_IncrRefCount(infoPtr->typeDestructorArgumentPtr); - infoPtr->lastIoPtr = NULL; - - Tcl_SetVar(interp, ITCL_NAMESPACE"::internal::dicts::classes", "", 0); - Tcl_SetVar(interp, ITCL_NAMESPACE"::internal::dicts::objects", "", 0); - Tcl_SetVar(interp, ITCL_NAMESPACE"::internal::dicts::classOptions", "", 0); - Tcl_SetVar(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedOptions", "", 0); - Tcl_SetVar(interp, - ITCL_NAMESPACE"::internal::dicts::classComponents", "", 0); - Tcl_SetVar(interp, - ITCL_NAMESPACE"::internal::dicts::classVariables", "", 0); - Tcl_SetVar(interp, - ITCL_NAMESPACE"::internal::dicts::classFunctions", "", 0); - Tcl_SetVar(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedFunctions", "", 0); - - hPtr = Tcl_CreateHashEntry(&infoPtr->classTypes, - (char *)Tcl_NewStringObj("class", -1), &isNew); - Tcl_SetHashValue(hPtr, ITCL_CLASS); - hPtr = Tcl_CreateHashEntry(&infoPtr->classTypes, - (char *)Tcl_NewStringObj("type", -1), &isNew); - Tcl_SetHashValue(hPtr, ITCL_TYPE); - hPtr = Tcl_CreateHashEntry(&infoPtr->classTypes, - (char *)Tcl_NewStringObj("widget", -1), &isNew); - Tcl_SetHashValue(hPtr, ITCL_WIDGET); - hPtr = Tcl_CreateHashEntry(&infoPtr->classTypes, - (char *)Tcl_NewStringObj("widgetadaptor", -1), &isNew); - Tcl_SetHashValue(hPtr, ITCL_WIDGETADAPTOR); - hPtr = Tcl_CreateHashEntry(&infoPtr->classTypes, - (char *)Tcl_NewStringObj("extendedclass", -1), &isNew); - Tcl_SetHashValue(hPtr, ITCL_ECLASS); - - res_option = getenv("ITCL_USE_OLD_RESOLVERS"); - if (res_option == NULL) { - opt = 1; - } else { - opt = atoi(res_option); - } - infoPtr->useOldResolvers = opt; - Itcl_InitStack(&infoPtr->clsStack); - - Tcl_SetAssocData(interp, ITCL_INTERP_DATA, - (Tcl_InterpDeleteProc*)FreeItclObjectInfo, (ClientData)infoPtr); - - Itcl_PreserveData((ClientData)infoPtr); - -#ifdef NEW_PROTO_RESOLVER - ItclVarsAndCommandResolveInit(interp); -#endif - - objPtr = Tcl_NewStringObj("::oo::class", -1); - root = Tcl_NewObjectInstance(interp, Tcl_GetObjectAsClass( - Tcl_GetObjectFromObj(interp, objPtr)), "::itcl::Root", - NULL, 0, NULL, 0); - Tcl_DecrRefCount(objPtr); - - Tcl_NewMethod(interp, Tcl_GetObjectAsClass(root), - Tcl_NewStringObj("unknown", -1), 0, &itclRootMethodType, - ItclUnknownGuts); - Tcl_NewMethod(interp, Tcl_GetObjectAsClass(root), - Tcl_NewStringObj("ItclConstructBase", -1), 0, - &itclRootMethodType, ItclConstructGuts); - Tcl_NewMethod(interp, Tcl_GetObjectAsClass(root), - Tcl_NewStringObj("info", -1), 1, - &itclRootMethodType, ItclInfoGuts); - - /* first create the Itcl base class as root of itcl classes */ - if (Tcl_EvalEx(interp, clazzClassScript, -1, 0) != TCL_OK) { - Tcl_Panic("cannot create Itcl root class ::itcl::clazz"); - } - clazzObjectPtr = Tcl_GetObjectFromObj(interp, Tcl_GetObjResult(interp)); - - - if (clazzObjectPtr == NULL) { - Tcl_AppendResult(interp, - "ITCL: cannot get Object for ::itcl::clazz for class \"", - "::itcl::clazz", "\"", NULL); - return TCL_ERROR; - } - - /* work around for SF bug #254 needed because of problem in TclOO 1.0.2 !! */ - if (Tcl_PkgPresent(interp, "TclOO", "1.0.2", 1) != NULL) { - Itcl_IncrObjectRefCount(clazzObjectPtr); - } - - infoPtr->clazzClassPtr = Tcl_GetObjectAsClass(clazzObjectPtr); - - /* - * Initialize the ensemble package first, since we need this - * for other parts of [incr Tcl]. - */ - - if (Itcl_EnsembleInit(interp) != TCL_OK) { - return TCL_ERROR; - } - - Itcl_ParseInit(interp, infoPtr); - - /* - * Create "itcl::builtin" namespace for commands that - * are automatically built into class definitions. - */ - if (Itcl_BiInit(interp, infoPtr) != TCL_OK) { - return TCL_ERROR; - } - - /* - * Export all commands in the "itcl" namespace so that they - * can be imported with something like "namespace import itcl::*" - */ - itclNs = Tcl_FindNamespace(interp, "::itcl", (Tcl_Namespace*)NULL, - TCL_LEAVE_ERR_MSG); - - /* - * This was changed from a glob export (itcl::*) to explicit - * command exports, so that the itcl::is command can *not* be - * exported. This is done for concern that the itcl::is command - * imported might be confusing ("is"). - */ - if (!itclNs || - (Tcl_Export(interp, itclNs, "body", /* reset */ 1) != TCL_OK) || - (Tcl_Export(interp, itclNs, "class", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "code", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "configbody", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "delete", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "delete_helper", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "ensemble", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "filter", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "find", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "forward", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "local", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "mixin", 0) != TCL_OK) || - (Tcl_Export(interp, itclNs, "scope", 0) != TCL_OK)) { - return TCL_ERROR; - } - - Tcl_CreateObjCommand(interp, - ITCL_NAMESPACE"::internal::commands::sethullwindowname", - ItclSetHullWindowName, infoPtr, NULL); - Tcl_CreateObjCommand(interp, - ITCL_NAMESPACE"::internal::commands::checksetitclhull", - ItclCheckSetItclHull, infoPtr, NULL); - - /* - * Set up the variables containing version info. - */ - - Tcl_SetVar(interp, "::itcl::version", ITCL_VERSION, TCL_NAMESPACE_ONLY); - Tcl_SetVar(interp, "::itcl::patchLevel", ITCL_PATCH_LEVEL, - TCL_NAMESPACE_ONLY); - - -#ifdef ITCL_DEBUG_C_INTERFACE - RegisterDebugCFunctions(interp); -#endif - /* - * Package is now loaded. - */ - - Tcl_PkgProvideEx(interp, "Itcl", ITCL_PATCH_LEVEL, &itclStubs); - return Tcl_PkgProvideEx(interp, "itcl", ITCL_PATCH_LEVEL, &itclStubs); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_Init() - * - * Invoked whenever a new INTERPRETER is created to install the - * [incr Tcl] package. Usually invoked within Tcl_AppInit() at - * the start of execution. - * - * Creates the "::itcl" namespace and installs access commands for - * creating classes and querying info. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error - * message in the interpreter) if anything goes wrong. - * ------------------------------------------------------------------------ - */ - -int -Itcl_Init ( - Tcl_Interp *interp) -{ - if (Initialize(interp) != TCL_OK) { - return TCL_ERROR; - } - - return Tcl_EvalEx(interp, initScript, -1, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_SafeInit() - * - * Invoked whenever a new SAFE INTERPRETER is created to install - * the [incr Tcl] package. - * - * Creates the "::itcl" namespace and installs access commands for - * creating classes and querying info. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error - * message in the interpreter) if anything goes wrong. - * ------------------------------------------------------------------------ - */ - -int -Itcl_SafeInit ( - Tcl_Interp *interp) -{ - if (Initialize(interp) != TCL_OK) { - return TCL_ERROR; - } - return Tcl_EvalEx(interp, safeInitScript, -1, 0); -} - -/* - * ------------------------------------------------------------------------ - * ItclSetHullWindowName() - * - * - * ------------------------------------------------------------------------ - */ -static int -ItclSetHullWindowName( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr; - - infoPtr = (ItclObjectInfo *)clientData; - if (infoPtr->currIoPtr != NULL) { - infoPtr->currIoPtr->hullWindowNamePtr = objv[1]; - Tcl_IncrRefCount(infoPtr->currIoPtr->hullWindowNamePtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclCheckSetItclHull() - * - * - * ------------------------------------------------------------------------ - */ -static int -ItclCheckSetItclHull( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - ItclObject *ioPtr; - ItclVariable *ivPtr; - ItclObjectInfo *infoPtr; - const char *valueStr; - - if (objc < 3) { - Tcl_AppendResult(interp, "ItclCheckSetItclHull wrong # args should be ", - "<objectName> <value>", NULL); - return TCL_ERROR; - } - - /* - * This is an internal command, and is never called with an - * objectName value other than the empty list. Check that with - * an assertion so alternative handling can be removed. - */ - assert( strlen(Tcl_GetString(objv[1])) == 0); - infoPtr = (ItclObjectInfo *)clientData; - { - ioPtr = infoPtr->currIoPtr; - if (ioPtr == NULL) { - Tcl_AppendResult(interp, "ItclCheckSetItclHull cannot find object", - NULL); - return TCL_ERROR; - } - } - objPtr = Tcl_NewStringObj("itcl_hull", -1); - hPtr = Tcl_FindHashEntry(&ioPtr->iclsPtr->variables, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "ItclCheckSetItclHull cannot find itcl_hull", - " variable for object \"", Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - ivPtr = Tcl_GetHashValue(hPtr); - valueStr = Tcl_GetString(objv[2]); - if (strcmp(valueStr, "2") == 0) { - ivPtr->initted = 2; - } else { - if (strcmp(valueStr, "0") == 0) { - ivPtr->initted = 0; - } else { - Tcl_AppendResult(interp, "ItclCheckSetItclHull bad value \"", - valueStr, "\"", NULL); - return TCL_ERROR; - } - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclFinishCmd() - * - * called when an interp is deleted to free up memory or called explicitly - * to check memory leaks - * - * ------------------------------------------------------------------------ - */ -static int -ItclFinishCmd( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_HashSearch place; - Tcl_Namespace *nsPtr; - Tcl_Obj **newObjv; - Tcl_Obj *objPtr; - Tcl_Obj *ensObjPtr; - Tcl_Command cmdPtr; - Tcl_Obj *mapDict; - ItclObjectInfo *infoPtr; - ItclCmdsInfo *iciPtr; - int checkMemoryLeaks; - int i; - int result; - - ItclShowArgs(1, "ItclFinishCmd", objc, objv); - result = TCL_OK; - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - if (infoPtr == NULL) { - infoPtr = (ItclObjectInfo *)clientData; - } - checkMemoryLeaks = 0; - if (objc > 1) { - if (strcmp(Tcl_GetString(objv[1]), "checkmemoryleaks") == 0) { - /* if we have that option, the namespace of the Tcl ensembles - * is not teared down, so we have to simulate it here to - * have the correct reference counts for infoPtr->infoVars2Ptr - * infoPtr->infoVars3Ptr and infoPtr->infoVars4Ptr - */ - checkMemoryLeaks = 1; - } - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * 2); - newObjv[0] = Tcl_NewStringObj("my", -1);; - for (i = 0; ;i++) { - iciPtr = &itclCmds[i]; - if (iciPtr->name == NULL) { - break; - } - if ((iciPtr->flags & ITCL_IS_ENSEMBLE) == 0) { - result = Itcl_RenameCommand(interp, iciPtr->name, ""); - } else { - objPtr = Tcl_NewStringObj(iciPtr->name, -1); - newObjv[1] = objPtr; - Itcl_EnsembleDeleteCmd(infoPtr, infoPtr->interp, 2, newObjv); - Tcl_DecrRefCount(objPtr); - } - iciPtr++; - } - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - - /* remove the unknow handler, to free the reference to the - * Tcl_Obj with the name of it */ - ensObjPtr = Tcl_NewStringObj("::itcl::builtin::Info::delegated", -1); - cmdPtr = Tcl_FindEnsemble(interp, ensObjPtr, TCL_LEAVE_ERR_MSG); - if (cmdPtr != NULL) { - Tcl_SetEnsembleUnknownHandler(NULL, cmdPtr, NULL); - } - Tcl_DecrRefCount(ensObjPtr); - - while (1) { - hPtr = Tcl_FirstHashEntry(&infoPtr->instances, &place); - if (hPtr == NULL) { - break; - } - Tcl_DeleteHashEntry(hPtr); - } - Tcl_DeleteHashTable(&infoPtr->instances); - - while (1) { - hPtr = Tcl_FirstHashEntry(&infoPtr->classTypes, &place); - if (hPtr == NULL) { - break; - } - Tcl_DeleteHashEntry(hPtr); - } - Tcl_DeleteHashTable(&infoPtr->classTypes); - - Tcl_DeleteHashTable(&infoPtr->procMethods); - - Tcl_DeleteHashTable(&infoPtr->objectCmds); - Tcl_DeleteHashTable(&infoPtr->classes); - Tcl_DeleteHashTable(&infoPtr->nameClasses); - Tcl_DeleteHashTable(&infoPtr->namespaceClasses); - - nsPtr = Tcl_FindNamespace(interp, "::itcl::parser", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - - mapDict = NULL; - ensObjPtr = Tcl_NewStringObj("::itcl::builtin::Info", -1); - if (Tcl_FindNamespace(interp, Tcl_GetString(ensObjPtr), NULL, 0) != NULL) { - Tcl_SetEnsembleUnknownHandler(NULL, - Tcl_FindEnsemble(interp, ensObjPtr, TCL_LEAVE_ERR_MSG), - NULL); - } - Tcl_DecrRefCount(ensObjPtr); - - /* remove the vars entry from the info dict */ - /* and replace it by the original one */ - cmdPtr = Tcl_FindCommand(interp, "info", NULL, TCL_GLOBAL_ONLY); - if (cmdPtr != NULL && Tcl_IsEnsemble(cmdPtr)) { - Tcl_GetEnsembleMappingDict(NULL, cmdPtr, &mapDict); - if (mapDict != NULL) { - - objPtr = Tcl_NewStringObj("vars", -1); - Tcl_DictObjRemove(interp, mapDict, objPtr); - Tcl_DictObjPut(interp, mapDict, objPtr, infoPtr->infoVars4Ptr); - Tcl_DecrRefCount(objPtr); - Tcl_SetEnsembleMappingDict(interp, cmdPtr, mapDict); - } - } - /* FIXME have to figure out why the refCount of - * ::itcl::builtin::Info - * and ::itcl::builtin::Info::vars and vars is 2 here !! */ - /* seems to be as the tclOO commands are not yet deleted ?? */ - Tcl_DecrRefCount(infoPtr->infoVars3Ptr); - Tcl_DecrRefCount(infoPtr->infoVars4Ptr); - if (checkMemoryLeaks) { - Tcl_DecrRefCount(infoPtr->infoVars3Ptr); - Tcl_DecrRefCount(infoPtr->infoVars4Ptr); - /* see comment above */ - } - - Tcl_DecrRefCount(infoPtr->typeDestructorArgumentPtr); - - Tcl_EvalEx(infoPtr->interp, - "::oo::define ::itcl::clazz deletemethod unknown", -1, 0); - - /* first have to look for the remaining memory leaks, then remove the next ifdef */ - Itcl_RenameCommand(infoPtr->interp, "::itcl::clazz", ""); - - /* tear down ::itcl namespace (this includes ::itcl::parser namespace) */ - nsPtr = Tcl_FindNamespace(infoPtr->interp, "::itcl::parser", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - nsPtr = Tcl_FindNamespace(infoPtr->interp, "::itcl::import", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - nsPtr = Tcl_FindNamespace(infoPtr->interp, "::itcl::internal", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - nsPtr = Tcl_FindNamespace(infoPtr->interp, "::itcl::builtin", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - nsPtr = Tcl_FindNamespace(infoPtr->interp, "::itcl", NULL, 0); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - - /* cleanup ensemble info */ - ItclFinishEnsemble(infoPtr); - - ckfree((char *)infoPtr->class_meta_type); - - Itcl_DeleteStack(&infoPtr->clsStack); - /* clean up list pool */ - Itcl_FinishList(); - - Itcl_ReleaseData((ClientData)infoPtr); - return result; -} - -#ifdef OBJ_REF_COUNT_DEBUG -void Tcl_DbDumpRefCountInfo(const char *fileName, int noDeleted); - - -/* - * ------------------------------------------------------------------------ - * ItclDumpRefCountInfo() - * - * debugging routine to check for memory leaks in use of Tcl_Obj's - * - * ------------------------------------------------------------------------ - */ -static int -ItclDumpRefCountInfo( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int noDeleted; - - noDeleted = 0; - if (objc > 1) { - if (strcmp(Tcl_GetString(objv[1]), "-nodeleted") == 0) { - noDeleted = 1; - } - } - ItclShowArgs(0, "ItclDumpRefCountInfo", objc, objv); - Tcl_DbDumpRefCountInfo(NULL, noDeleted); - return TCL_OK; -} -#endif - -#ifdef ITCL_PRESERVE_DEBUG -void Itcl_DbDumpPreserveInfo(const char *fileName); - - -/* - * ------------------------------------------------------------------------ - * ItclDumpPreserveInfo() - * - * debugging routine to check for memory leaks in use of Itcl_PreserveData - * and Itcl_ReleaseData - * - * ------------------------------------------------------------------------ - */ -static int -ItclDumpPreserveInfo( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(0, "ItclDumpPreserveInfo", objc, objv); - Itcl_DbDumpPreserveInfo(NULL); - return TCL_OK; -} -#endif diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclBuiltin.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclBuiltin.c deleted file mode 100644 index e605762..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclBuiltin.c +++ /dev/null @@ -1,3783 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * These procedures handle built-in class methods, including the - * "isa" method (to query hierarchy info) and the "info" method - * (to query class/object data). - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -static char initHullCmdsScript[] = -"namespace eval ::itcl {\n" -" proc _find_hull_init {} {\n" -" global env tcl_library\n" -" variable library\n" -" variable patchLevel\n" -" rename _find_hull_init {}\n" -" if {[info exists library]} {\n" -" lappend dirs $library\n" -" } else {\n" -" if {[catch {uplevel #0 source -rsrc itcl}] == 0} {\n" -" return\n" -" }\n" -" set dirs {}\n" -" if {[info exists env(ITCL_LIBRARY)]} {\n" -" lappend dirs $env(ITCL_LIBRARY)\n" -" }\n" -" lappend dirs [file join [file dirname $tcl_library] itcl$patchLevel]\n" -" set bindir [file dirname [info nameofexecutable]]\n" -" lappend dirs [file join . library]\n" -" lappend dirs [file join $bindir .. lib itcl$patchLevel]\n" -" lappend dirs [file join $bindir .. library]\n" -" lappend dirs [file join $bindir .. .. library]\n" -" lappend dirs [file join $bindir .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. itcl-ng itcl library]\n" -" # On MacOSX, check the directories in the tcl_pkgPath\n" -" if {[string equal $::tcl_platform(platform) \"unix\"] && " -" [string equal $::tcl_platform(os) \"Darwin\"]} {\n" -" foreach d $::tcl_pkgPath {\n" -" lappend dirs [file join $d itcl$patchLevel]\n" -" }\n" -" }\n" -" # On *nix, check the directories in the tcl_pkgPath\n" -" if {[string equal $::tcl_platform(platform) \"unix\"]} {\n" -" foreach d $::tcl_pkgPath {\n" -" lappend dirs $d\n" -" lappend dirs [file join $d itcl$patchLevel]\n" -" }\n" -" }\n" -" }\n" -" foreach i $dirs {\n" -" set library $i\n" -" set itclfile [file join $i itclHullCmds.tcl]\n" -" if {![catch {uplevel #0 [list source $itclfile]} msg]} {\n" -" return\n" -" }\n" -"puts stderr \"MSG!$msg!\"\n" -" }\n" -" set msg \"Can't find a usable itclHullCmds.tcl in the following directories:\n\"\n" -" append msg \" $dirs\n\"\n" -" append msg \"This probably means that Itcl/Tcl weren't installed properly.\n\"\n" -" append msg \"If you know where the Itcl library directory was installed,\n\"\n" -" append msg \"you can set the environment variable ITCL_LIBRARY to point\n\"\n" -" append msg \"to the library directory.\n\"\n" -" error $msg\n" -" }\n" -" _find_hull_init\n" -"}"; - -static Tcl_ObjCmdProc Itcl_BiDestroyCmd; -static Tcl_ObjCmdProc ItclExtendedConfigure; -static Tcl_ObjCmdProc ItclExtendedCget; -static Tcl_ObjCmdProc ItclExtendedSetGet; -static Tcl_ObjCmdProc Itcl_BiCreateHullCmd; -static Tcl_ObjCmdProc Itcl_BiSetupComponentCmd; -static Tcl_ObjCmdProc Itcl_BiKeepComponentOptionCmd; -static Tcl_ObjCmdProc Itcl_BiIgnoreComponentOptionCmd; -static Tcl_ObjCmdProc Itcl_BiInitOptionsCmd; - -/* - * FORWARD DECLARATIONS - */ -static Tcl_Obj* ItclReportPublicOpt(Tcl_Interp *interp, - ItclVariable *ivPtr, ItclObject *contextIoPtr); - -static Tcl_ObjCmdProc ItclBiClassUnknownCmd; -/* - * Standard list of built-in methods for all objects. - */ -typedef struct BiMethod { - const char* name; /* method name */ - const char* usage; /* string describing usage */ - const char* registration;/* registration name for C proc */ - Tcl_ObjCmdProc *proc; /* implementation C proc */ - int flags; /* flag for which type of class to be used */ -} BiMethod; - -static const BiMethod BiMethodList[] = { - { "callinstance", - "<instancename>", - "@itcl-builtin-callinstance", - Itcl_BiCallInstanceCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "getinstancevar", - "<instancename>", - "@itcl-builtin-getinstancevar", - Itcl_BiGetInstanceVarCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "cget", - "-option", - "@itcl-builtin-cget", - Itcl_BiCgetCmd, - ITCL_CLASS|ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "configure", - "?-option? ?value -option value...?", - "@itcl-builtin-configure", - Itcl_BiConfigureCmd, - ITCL_CLASS|ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - {"createhull", - "widgetType widgetPath ?-class className? ?optionName value ...?", - "@itcl-builtin-createhull", - Itcl_BiCreateHullCmd, - ITCL_ECLASS - }, - { "destroy", - "", - "@itcl-builtin-destroy", - Itcl_BiDestroyCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "installcomponent", - "<componentName> using <classname> <winpath> ?-option value...?", - "@itcl-builtin-installcomponent", - Itcl_BiInstallComponentCmd, - ITCL_WIDGET - }, - { "itcl_hull", - "", - "@itcl-builtin-itcl_hull", - Itcl_BiItclHullCmd, - ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "isa", - "className", - "@itcl-builtin-isa", - Itcl_BiIsaCmd, - ITCL_CLASS|ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET - }, - {"itcl_initoptions", - "?optionName value ...?", - "@itcl-builtin-initoptions", - Itcl_BiInitOptionsCmd, - ITCL_ECLASS - }, - { "mymethod", - "", - "@itcl-builtin-mymethod", - Itcl_BiMyMethodCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "myvar", - "", - "@itcl-builtin-myvar", - Itcl_BiMyVarCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "myproc", - "", - "@itcl-builtin-myproc", - Itcl_BiMyProcCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "mytypemethod", - "", - "@itcl-builtin-mytypemethod", - Itcl_BiMyTypeMethodCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "mytypevar", - "", - "@itcl-builtin-mytypevar", - Itcl_BiMyTypeVarCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - { "setget", - "varName ?value?", - "@itcl-builtin-setget", - ItclExtendedSetGet, - ITCL_ECLASS - }, - { "unknown", - "", - "@itcl-builtin-classunknown", - ItclBiClassUnknownCmd, - ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR - }, - {"keepcomponentoption", - "componentName optionName ?optionName ...?", - "@itcl-builtin-keepcomponentoption", - Itcl_BiKeepComponentOptionCmd, - ITCL_ECLASS - }, - {"ignorecomponentoption", - "componentName optionName ?optionName ...?", - "@itcl-builtin-ignorecomponentoption", - Itcl_BiIgnoreComponentOptionCmd, - ITCL_ECLASS - }, - /* the next 3 are defined in library/itclHullCmds.tcl */ - {"addoptioncomponent", - "componentName optionName ?optionName ...?", - "@itcl-builtin-addoptioncomponent", - NULL, - ITCL_ECLASS - }, - {"ignoreoptioncomponent", - "componentName optionName ?optionName ...?", - "@itcl-builtin-ignoreoptioncomponent", - NULL, - ITCL_ECLASS - }, - {"renameoptioncomponent", - "componentName optionName ?optionName ...?", - "@itcl-builtin-renameoptioncomponent", - NULL, - ITCL_ECLASS - }, - {"setupcomponent", - "componentName using widgetType widgetPath ?optionName value ...?", - "@itcl-builtin-setupcomponent", - Itcl_BiSetupComponentCmd, - ITCL_ECLASS - }, -}; -static int BiMethodListLen = sizeof(BiMethodList)/sizeof(BiMethod); - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInit() - * - * Creates a namespace full of built-in methods/procs for [incr Tcl] - * classes. This includes things like the "isa" method and "info" - * for querying class info. Usually invoked by Itcl_Init() when - * [incr Tcl] is first installed into an interpreter. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -int -Itcl_BiInit( - Tcl_Interp *interp, /* current interpreter */ - ItclObjectInfo *infoPtr) -{ - Tcl_Namespace *itclBiNs; - Tcl_DString buffer; - Tcl_Obj *mapDict; - Tcl_Command infoCmd; - int result; - int i; - - /* - * "::itcl::builtin" commands. - * These commands are imported into each class - * just before the class definition is parsed. - */ - Tcl_DStringInit(&buffer); - for (i=0; i < BiMethodListLen; i++) { - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, "::itcl::builtin::", -1); - Tcl_DStringAppend(&buffer, BiMethodList[i].name, -1); - Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer), - BiMethodList[i].proc, (ClientData)infoPtr, - (Tcl_CmdDeleteProc*)NULL); - } - Tcl_DStringFree(&buffer); - - Tcl_CreateObjCommand(interp, "::itcl::builtin::chain", Itcl_BiChainCmd, - NULL, (Tcl_CmdDeleteProc*)NULL); - - Tcl_CreateObjCommand(interp, "::itcl::builtin::classunknown", - ItclBiClassUnknownCmd, infoPtr, (Tcl_CmdDeleteProc*)NULL); - - ItclInfoInit(interp, infoPtr); - /* - * Export all commands in the built-in namespace so we can - * import them later on. - */ - itclBiNs = Tcl_FindNamespace(interp, "::itcl::builtin", - (Tcl_Namespace*)NULL, TCL_LEAVE_ERR_MSG); - - if ((itclBiNs == NULL) || - Tcl_Export(interp, itclBiNs, "[a-z]*", /* resetListFirst */ 1) != TCL_OK) { - return TCL_ERROR; - } - /* - * Install into the master [info] ensemble. - */ - - infoCmd = Tcl_FindCommand(interp, "info", NULL, TCL_GLOBAL_ONLY); - if (infoCmd != NULL && Tcl_IsEnsemble(infoCmd)) { - Tcl_GetEnsembleMappingDict(NULL, infoCmd, &mapDict); - if (mapDict != NULL) { - infoPtr->infoVars4Ptr = - Tcl_NewStringObj("vars", -1); - Tcl_IncrRefCount(infoPtr->infoVars4Ptr); - result = Tcl_DictObjGet(interp, mapDict, infoPtr->infoVars4Ptr, - &infoPtr->infoVarsPtr); - if(result != TCL_OK) { - /* FIXME need code here!! */ - } - - infoPtr->infoVars3Ptr = - Tcl_NewStringObj("::itcl::builtin::Info::vars", -1); - /* FIXME see comment in itclBase.c ItclFinishCmd */ - Tcl_IncrRefCount(infoPtr->infoVars3Ptr); - Tcl_DictObjPut(NULL, mapDict, infoPtr->infoVars4Ptr, - infoPtr->infoVars3Ptr); - Tcl_SetEnsembleMappingDict(interp, infoCmd, mapDict); - } - } - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_InstallBiMethods() - * - * Invoked when a class is first created, just after the class - * definition has been parsed, to add definitions for built-in - * methods to the class. If a method already exists in the class - * with the same name as the built-in, then the built-in is skipped. - * Otherwise, a method definition for the built-in method is added. - * - * Returns TCL_OK if successful, or TCL_ERROR (along with an error - * message in the interpreter) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_InstallBiMethods( - Tcl_Interp *interp, /* current interpreter */ - ItclClass *iclsPtr) /* class definition to be updated */ -{ - int result = TCL_OK; - - int i; - ItclHierIter hier; - ItclClass *superPtr; - - /* - * Scan through all of the built-in methods and see if - * that method already exists in the class. If not, add - * it in. - * - * TRICKY NOTE: The virtual tables haven't been built yet, - * so look for existing methods the hard way--by scanning - * through all classes. - */ - Tcl_Obj *objPtr = Tcl_NewStringObj("", 0); - for (i=0; i < BiMethodListLen; i++) { - Tcl_HashEntry *hPtr = NULL; - - Itcl_InitHierIter(&hier, iclsPtr); - Tcl_SetStringObj(objPtr, BiMethodList[i].name, -1); - superPtr = Itcl_AdvanceHierIter(&hier); - while (superPtr) { - hPtr = Tcl_FindHashEntry(&superPtr->functions, (char *)objPtr); - if (hPtr) { - break; - } - superPtr = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - - if (!hPtr) { - if (iclsPtr->flags & BiMethodList[i].flags) { - result = Itcl_CreateMethod(interp, iclsPtr, - Tcl_NewStringObj(BiMethodList[i].name, -1), - BiMethodList[i].usage, BiMethodList[i].registration); - - if (result != TCL_OK) { - break; - } - } - } - } - - /* - * Every Itcl class gets an info method installed so that each has - * a proper context for the subcommands to do their context senstive - * work. - */ - - if (result == TCL_OK - && (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - result = Itcl_CreateMethod(interp, iclsPtr, - Tcl_NewStringObj("info", -1), NULL, "@itcl-builtin-info"); - } - - Tcl_DecrRefCount(objPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiIsaCmd() - * - * Invoked whenever the user issues the "isa" method for an object. - * Handles the following syntax: - * - * <objName> isa <className> - * - * Checks to see if the object has the given <className> anywhere - * in its heritage. Returns 1 if so, and 0 otherwise. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiIsaCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - const char *token; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be \"object isa className\"", - (char*)NULL); - return TCL_ERROR; - } - if (objc != 2) { - token = Tcl_GetString(objv[0]); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"object ", token, " className\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Look for the requested class. If it is not found, then - * try to autoload it. If it absolutely cannot be found, - * signal an error. - */ - token = Tcl_GetString(objv[1]); - iclsPtr = Itcl_FindClass(interp, token, /* autoload */ 1); - if (iclsPtr == NULL) { - return TCL_ERROR; - } - - if (Itcl_ObjectIsa(contextIoPtr, iclsPtr)) { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); - } else { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); - } - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiConfigureCmd() - * - * Invoked whenever the user issues the "configure" method for an object. - * Handles the following syntax: - * - * <objName> configure ?-<option>? ?<value> -<option> <value>...? - * - * Allows access to public variables as if they were configuration - * options. With no arguments, this command returns the current - * list of public variable options. If -<option> is specified, - * this returns the information for just one option: - * - * -<optionName> <initVal> <currentVal> - * - * Otherwise, the list of arguments is parsed, and values are - * assigned to the various public variable options. When each - * option changes, a big of "config" code associated with the option - * is executed, to bring the object up to date. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiConfigureCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_DString buffer; - Tcl_DString buffer2; - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - Tcl_Namespace *saveNsPtr; - Tcl_Obj * const *unparsedObjv; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - ItclVarLookup *vlookup; - ItclMemberCode *mcode; - ItclHierIter hier; - ItclObjectInfo *infoPtr; - const char *lastval; - const char *token; - char *varName; - int i; - int unparsedObjc; - int result; - - ItclShowArgs(1, "Itcl_BiConfigureCmd", objc, objv); - vlookup = NULL; - token = NULL; - hPtr = NULL; - unparsedObjc = objc; - unparsedObjv = objv; - Tcl_DStringInit(&buffer); - Tcl_DStringInit(&buffer2); - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be ", - "\"object configure ?-option? ?value -option value...?\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * BE CAREFUL: work in the virtual scope! - */ - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - infoPtr = contextIclsPtr->infoPtr; - if (!(contextIclsPtr->flags & ITCL_CLASS)) { - /* first check if it is an option */ - if (objc > 1) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->options, - (char *) objv[1]); - } - result = ItclExtendedConfigure(contextIclsPtr, interp, objc, objv); - if (result != TCL_CONTINUE) { - return result; - } - if (infoPtr->unparsedObjc > 0) { - unparsedObjc = infoPtr->unparsedObjc; - unparsedObjv = infoPtr->unparsedObjv; - } else { - unparsedObjc = objc; - } - } - /* - * HANDLE: configure - */ - if (unparsedObjc == 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->variables, &place); - while (hPtr) { - ivPtr = (ItclVariable*)Tcl_GetHashValue(hPtr); - if (ivPtr->protection == ITCL_PUBLIC) { - objPtr = ItclReportPublicOpt(interp, ivPtr, contextIoPtr); - - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - return TCL_OK; - } else { - - /* - * HANDLE: configure -option - */ - if (unparsedObjc == 2) { - token = Tcl_GetStringFromObj(unparsedObjv[1], (int*)NULL); - if (*token != '-') { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be ", - "\"object configure ?-option? ?value -option value...?\"", - (char*)NULL); - return TCL_ERROR; - } - - vlookup = NULL; - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, token+1); - if (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - - if (vlookup->ivPtr->protection != ITCL_PUBLIC) { - vlookup = NULL; - } - } - if (!vlookup) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "unknown option \"", token, "\"", - (char*)NULL); - return TCL_ERROR; - } - resultPtr = ItclReportPublicOpt(interp, - vlookup->ivPtr, contextIoPtr); - Tcl_SetObjResult(interp, resultPtr); - return TCL_OK; - } - } - - /* - * HANDLE: configure -option value -option value... - * - * Be careful to work in the virtual scope. If this "configure" - * method was defined in a base class, the current namespace - * (from Itcl_ExecMethod()) will be that base class. Activate - * the derived class namespace here, so that instance variables - * are accessed properly. - */ - result = TCL_OK; - - for (i=1; i < unparsedObjc; i+=2) { - if (i+1 >= unparsedObjc) { - Tcl_AppendResult(interp, "need option value pair", NULL); - result = TCL_ERROR; - goto configureDone; - } - vlookup = NULL; - token = Tcl_GetString(unparsedObjv[i]); - if (*token == '-') { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, token+1); - if (hPtr == NULL) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, token); - } - if (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - } - } - - if (!vlookup || (vlookup->ivPtr->protection != ITCL_PUBLIC)) { - Tcl_AppendResult(interp, "unknown option \"", token, "\"", - (char*)NULL); - result = TCL_ERROR; - goto configureDone; - } - if (i == unparsedObjc-1) { - Tcl_AppendResult(interp, "value for \"", token, "\" missing", - (char*)NULL); - result = TCL_ERROR; - goto configureDone; - } - - ivPtr = vlookup->ivPtr; - Tcl_DStringSetLength(&buffer2, 0); - if (!(ivPtr->flags & ITCL_COMMON)) { - Tcl_DStringAppend(&buffer2, - Tcl_GetString(contextIoPtr->varNsNamePtr), -1); - } - Tcl_DStringAppend(&buffer2, - Tcl_GetString(ivPtr->iclsPtr->fullNamePtr), -1); - Tcl_DStringAppend(&buffer2, "::", 2); - Tcl_DStringAppend(&buffer2, - Tcl_GetString(ivPtr->namePtr), -1); - varName = Tcl_DStringValue(&buffer2); - lastval = Tcl_GetVar2(interp, varName, (char*)NULL, 0); - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, (lastval) ? lastval : "", -1); - - token = Tcl_GetString(unparsedObjv[i+1]); - if (Tcl_SetVar2(interp, varName, (char*)NULL, token, - TCL_LEAVE_ERR_MSG) == NULL) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (error in configuration of public variable \"%s\")", - Tcl_GetString(ivPtr->fullNamePtr))); - result = TCL_ERROR; - goto configureDone; - } - - /* - * If this variable has some "config" code, invoke it now. - * - * TRICKY NOTE: Be careful to evaluate the code one level - * up in the call stack, so that it's executed in the - * calling context, and not in the context that we've - * set up for public variable access. - */ - mcode = ivPtr->codePtr; - if (mcode && Itcl_IsMemberCodeImplemented(mcode)) { - if (!ivPtr->iclsPtr->infoPtr->useOldResolvers) { - Itcl_SetCallFrameResolver(interp, contextIoPtr->resolvePtr); - } - saveNsPtr = Tcl_GetCurrentNamespace(interp); - Itcl_SetCallFrameNamespace(interp, ivPtr->iclsPtr->nsPtr); - result = Tcl_EvalObjEx(interp, mcode->bodyPtr, 0); - Itcl_SetCallFrameNamespace(interp, saveNsPtr); - if (result == TCL_OK) { - Tcl_ResetResult(interp); - } else { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (error in configuration of public variable \"%s\")", - Tcl_GetString(ivPtr->fullNamePtr))); - Tcl_SetVar2(interp, varName,(char*)NULL, - Tcl_DStringValue(&buffer), 0); - - goto configureDone; - } - } - } - -configureDone: - if (infoPtr->unparsedObjc > 0) { - ckfree ((char *)infoPtr->unparsedObjv); - infoPtr->unparsedObjv = NULL; - infoPtr->unparsedObjc = 0; - } - Tcl_DStringFree(&buffer2); - Tcl_DStringFree(&buffer); - - return result; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiCgetCmd() - * - * Invoked whenever the user issues the "cget" method for an object. - * Handles the following syntax: - * - * <objName> cget -<option> - * - * Allows access to public variables as if they were configuration - * options. Mimics the behavior of the usual "cget" method for - * Tk widgets. Returns the current value of the public variable - * with name <option>. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiCgetCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - const char *name; - const char *val; - int result; - - ItclShowArgs(1,"Itcl_BiCgetCmd", objc, objv); - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if ((contextIoPtr == NULL) || objc != 2) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be \"object cget -option\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * BE CAREFUL: work in the virtual scope! - */ - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - if (!(contextIclsPtr->flags & ITCL_CLASS)) { - result = ItclExtendedCget(contextIclsPtr, interp, objc, objv); - if (result != TCL_CONTINUE) { - return result; - } - } - name = Tcl_GetString(objv[1]); - - vlookup = NULL; - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, name+1); - if (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - } - - if ((vlookup == NULL) || (vlookup->ivPtr->protection != ITCL_PUBLIC)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "unknown option \"", name, "\"", - (char*)NULL); - return TCL_ERROR; - } - - val = Itcl_GetInstanceVar(interp, - Tcl_GetString(vlookup->ivPtr->namePtr), - contextIoPtr, vlookup->ivPtr->iclsPtr); - - if (val) { - Tcl_SetObjResult(interp, Tcl_NewStringObj(val, -1)); - } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj("<undefined>", -1)); - } - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * ItclReportPublicOpt() - * - * Returns information about a public variable formatted as a - * configuration option: - * - * -<varName> <initVal> <currentVal> - * - * Used by Itcl_BiConfigureCmd() to report configuration options. - * Returns a Tcl_Obj containing the information. - * ------------------------------------------------------------------------ - */ -static Tcl_Obj* -ItclReportPublicOpt( - Tcl_Interp *interp, /* interpreter containing the object */ - ItclVariable *ivPtr, /* public variable to be reported */ - ItclObject *contextIoPtr) /* object containing this variable */ -{ - const char *val; - ItclClass *iclsPtr; - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - Tcl_DString optName; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - /* - * Determine how the option name should be reported. - * If the simple name can be used to find it in the virtual - * data table, then use the simple name. Otherwise, this - * is a shadowed variable; use the full name. - */ - Tcl_DStringInit(&optName); - Tcl_DStringAppend(&optName, "-", -1); - - iclsPtr = (ItclClass*)contextIoPtr->iclsPtr; - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, - Tcl_GetString(ivPtr->fullNamePtr)); - assert(hPtr != NULL); - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - Tcl_DStringAppend(&optName, vlookup->leastQualName, -1); - - objPtr = Tcl_NewStringObj(Tcl_DStringValue(&optName), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - Tcl_DStringFree(&optName); - - - if (ivPtr->init) { - objPtr = ivPtr->init; - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - - val = Itcl_GetInstanceVar(interp, Tcl_GetString(ivPtr->namePtr), - contextIoPtr, ivPtr->iclsPtr); - - if (val) { - objPtr = Tcl_NewStringObj((const char *)val, -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - - return listPtr; -} - -/* - * ------------------------------------------------------------------------ - * ItclReportOption() - * - * Returns information about an option formatted as a - * configuration option: - * - * <optionName> <initVal> <currentVal> - * - * Used by ItclExtendedConfigure() to report configuration options. - * Returns a Tcl_Obj containing the information. - * ------------------------------------------------------------------------ - */ -static Tcl_Obj* -ItclReportOption( - Tcl_Interp *interp, /* interpreter containing the object */ - ItclOption *ioptPtr, /* option to be reported */ - ItclObject *contextIoPtr) /* object containing this variable */ -{ - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - ItclDelegatedOption *idoPtr; - const char *val; - - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - idoPtr = ioptPtr->iclsPtr->infoPtr->currIdoPtr; - if (idoPtr != NULL) { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, idoPtr->namePtr); - if (idoPtr->resourceNamePtr == NULL) { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - Tcl_NewStringObj("", -1)); - /* FIXME possible memory leak */ - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - idoPtr->resourceNamePtr); - } - if (idoPtr->classNamePtr == NULL) { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - Tcl_NewStringObj("", -1)); - /* FIXME possible memory leak */ - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - idoPtr->classNamePtr); - } - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, ioptPtr->namePtr); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - ioptPtr->resourceNamePtr); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, - ioptPtr->classNamePtr); - } - if (ioptPtr->defaultValuePtr) { - objPtr = ioptPtr->defaultValuePtr; - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - val = ItclGetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), - contextIoPtr, ioptPtr->iclsPtr); - if (val) { - objPtr = Tcl_NewStringObj((const char *)val, -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - return listPtr; -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiChainCmd() - * - * Invoked to handle the "chain" command, to access the version of - * a method or proc that exists in a base class. Handles the - * following syntax: - * - * chain ?<arg> <arg>...? - * - * Looks up the inheritance hierarchy for another implementation - * of the method/proc that is currently executing. If another - * implementation is found, it is invoked with the specified - * <arg> arguments. If it is not found, this command does nothing. - * This allows a base class method to be called out in a generic way, - * so the code will not have to change if the base class changes. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -NRBiChainCmd( - ClientData dummy, /* not used */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result = TCL_OK; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - const char *cmd; - char *cmd1; - const char *head; - ItclClass *iclsPtr; - ItclHierIter hier; - Tcl_HashEntry *hPtr; - ItclMemberFunc *imPtr; - Tcl_DString buffer; - Tcl_Obj *cmdlinePtr; - Tcl_Obj **newobjv; - Tcl_Obj * const *cObjv; - int cObjc; - int idx; - Tcl_Obj *objPtr; - - ItclShowArgs(1, "Itcl_BiChainCmd", objc, objv); - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot chain functions outside of a class context", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Try to get the command name from the current call frame. - * If it cannot be determined, do nothing. Otherwise, trim - * off any leading path names. - */ - cObjv = Itcl_GetCallVarFrameObjv(interp); - if (cObjv == NULL) { - return TCL_OK; - } - cObjc = Itcl_GetCallVarFrameObjc(interp); - - if ((Itcl_GetCallFrameClientData(interp) == NULL) || (objc == 1)) { - /* that has been a direct call, so no object in front !! */ - if (objc == 1 && cObjc >= 2) { - idx = 1; - } else { - idx = 0; - } - } else { - idx = 1; - } - cmd1 = (char *)ckalloc(strlen(Tcl_GetString(cObjv[idx]))+1); - strcpy(cmd1, Tcl_GetString(cObjv[idx])); - Itcl_ParseNamespPath(cmd1, &buffer, &head, &cmd); - - /* - * Look for the specified command in one of the base classes. - * If we have an object context, then start from the most-specific - * class and walk up the hierarchy to the current context. If - * there is multiple inheritance, having the entire inheritance - * hierarchy will allow us to jump over to another branch of - * the inheritance tree. - * - * If there is no object context, just start with the current - * class context. - */ - if (contextIoPtr != NULL) { - Itcl_InitHierIter(&hier, contextIoPtr->iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - if (iclsPtr == contextIclsPtr) { - break; - } - } - } else { - Itcl_InitHierIter(&hier, contextIclsPtr); - Itcl_AdvanceHierIter(&hier); /* skip the current class */ - } - - /* - * Now search up the class hierarchy for the next implementation. - * If found, execute it. Otherwise, do nothing. - */ - objPtr = Tcl_NewStringObj(cmd, -1); - ckfree(cmd1); - Tcl_IncrRefCount(objPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->functions, (char *)objPtr); - if (hPtr) { - int my_objc; - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(hPtr); - - /* - * NOTE: Avoid the usual "virtual" behavior of - * methods by passing the full name as - * the command argument. - */ - - cmdlinePtr = Itcl_CreateArgs(interp, - Tcl_GetString(imPtr->fullNamePtr), objc-1, objv+1); - - (void) Tcl_ListObjGetElements((Tcl_Interp*)NULL, cmdlinePtr, - &my_objc, &newobjv); - - if (imPtr->flags & ITCL_CONSTRUCTOR) { - contextIoPtr = imPtr->iclsPtr->infoPtr->currIoPtr; - } - ItclShowArgs(1, "___chain", objc-1, newobjv+1); - result = Itcl_EvalMemberCode(interp, imPtr, contextIoPtr, - my_objc-1, newobjv+1); - Tcl_DecrRefCount(cmdlinePtr); - break; - } - } - Tcl_DecrRefCount(objPtr); - - Tcl_DStringFree(&buffer); - Itcl_DeleteHierIter(&hier); - return result; -} -/* ARGSUSED */ -int -Itcl_BiChainCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRBiChainCmd, clientData, objc, objv); -} - -static int -CallCreateObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_CallFrame frame; - Tcl_Namespace *nsPtr; - ItclClass *iclsPtr = data[0]; - int objc = PTR2INT(data[1]); - Tcl_Obj *const *objv = data[2]; - - if (result != TCL_OK) { - return result; - } - nsPtr = Itcl_GetUplevelNamespace(interp, 1); - if (Itcl_PushCallFrame(interp, &frame, nsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - return TCL_ERROR; - } - result = ItclClassCreateObject(iclsPtr->infoPtr, interp, objc, objv); - Itcl_PopCallFrame(interp); - Tcl_DecrRefCount(objv[2]); - Tcl_DecrRefCount(objv[1]); - Tcl_DecrRefCount(objv[0]); - return result; -} - -static int -PrepareCreateObject( - Tcl_Interp *interp, - ItclClass *iclsPtr, - int objc, - Tcl_Obj * const *objv) -{ - Tcl_HashEntry *hPtr; - Tcl_Obj **newObjv; - void *callbackPtr; - const char *funcName; - int result; - int offset; - - offset = 1; - funcName = Tcl_GetString(objv[1]); - if (strcmp(funcName, "itcl_hull") == 0) { - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR ", - "cannot find itcl_hull method", NULL); - return TCL_ERROR; - } - result = Itcl_ExecProc(Tcl_GetHashValue(hPtr), interp, objc, objv); - return result; - } - if (strcmp(funcName, "create") == 0) { - /* allow typeClassName create objectName */ - offset++; - } else { - /* allow typeClassName objectName */ - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc+3-offset)); - newObjv[0] = objv[0]; - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = iclsPtr->namePtr; - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = Tcl_NewStringObj(iclsPtr->nsPtr->fullName, -1); - Tcl_IncrRefCount(newObjv[2]); - memcpy(newObjv+3, objv+offset, (objc-offset) * sizeof(Tcl_Obj *)); - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - ItclShowArgs(1, "CREATE", objc+3-offset, newObjv); - Tcl_NRAddCallback(interp, CallCreateObject, iclsPtr, - INT2PTR(objc+3-offset), (ClientData)newObjv, NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (result != TCL_OK) { - if (iclsPtr->infoPtr->currIoPtr != NULL) { - /* we are in a constructor call */ - if (iclsPtr->infoPtr->currIoPtr->hadConstructorError == 0) { - iclsPtr->infoPtr->currIoPtr->hadConstructorError = 1; - } - } - } - ckfree((char *)newObjv); - return result; -} -/* - * ------------------------------------------------------------------------ - * ItclBiClassUnknownCmd() - * - * Invoked to handle the "classunknown" command - * this is called whenever an object is called with an unknown method/proc - * following syntax: - * - * classunknown <object> <methodname> ?<arg> <arg>...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -ItclBiClassUnknownCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Obj **newObjv; - Tcl_Obj **lObjv; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - Tcl_Obj *resPtr; - Tcl_DString buffer; - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - ItclComponent *icPtr; - ItclDelegatedFunction *idmPtr; - ItclDelegatedFunction *idmPtr2; - ItclDelegatedFunction *starIdmPtr; - const char *resStr; - const char *val; - const char *funcName; - int lObjc; - int result; - int offset; - int useComponent; - int isItclHull; - int isTypeMethod; - int isStar; - int isNew; - int idx; - - ItclShowArgs(1, "ItclBiClassUnknownCmd", objc, objv); - listPtr = NULL; - useComponent = 1; - isStar = 0; - isTypeMethod = 0; - isItclHull = 0; - starIdmPtr = NULL; - infoPtr = (ItclObjectInfo *)clientData; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, - (char *)Tcl_GetCurrentNamespace(interp)); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR: ItclBiClassUnknownCmd ", - "cannot find class\n", NULL); - return TCL_ERROR; - } - iclsPtr = Tcl_GetHashValue(hPtr); - funcName = Tcl_GetString(objv[1]); - if (strcmp(funcName, "create") == 0) { - /* check if we have a user method create. If not, it is the builtin - * create method and we don't need to check for delegation - * and components with ITCL_COMPONENT_INHERIT - */ - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objv[1]); - if (hPtr == NULL) { - return PrepareCreateObject(interp, iclsPtr, objc, objv); - } - } - if (strcmp(funcName, "itcl_hull") == 0) { - isItclHull = 1; - } - if (!isItclHull) { - FOREACH_HASH_VALUE(icPtr, &iclsPtr->components) { - if (icPtr->flags & ITCL_COMPONENT_INHERIT) { - val = Tcl_GetVar2(interp, Tcl_GetString(icPtr->namePtr), - NULL, 0); - if ((val != NULL) && (strlen(val) > 0)) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv+1, objv+1, sizeof(Tcl_Obj *) * (objc-1)); - ItclShowArgs(1, "UK EVAL1", objc, newObjv); - result = Tcl_EvalObjv(interp, objc, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - return result; - } - } - } - } - /* from a class object only typemethods can be called directly - * if delegated, so check for that, otherwise create an object - * for ITCL_ECLASS we allow calling too - */ - hPtr = NULL; - isTypeMethod = 0; - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(Tcl_GetString(idmPtr->namePtr), funcName) == 0) { - if (idmPtr->flags & ITCL_TYPE_METHOD) { - isTypeMethod = 1; - } - if (iclsPtr->flags & ITCL_ECLASS) { - isTypeMethod = 1; - } - break; - } - if (strcmp(Tcl_GetString(idmPtr->namePtr), "*") == 0) { - if (idmPtr->flags & ITCL_TYPE_METHOD) { - isTypeMethod = 1; - } - starIdmPtr = idmPtr; - break; - } - } - idmPtr = NULL; - if (isTypeMethod) { - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, (char *)objv[1]); - if (hPtr == NULL) { - objPtr = Tcl_NewStringObj("*", -1); - Tcl_IncrRefCount(objPtr); - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - idmPtr = Tcl_GetHashValue(hPtr); - isStar = 1; - } - } - if (isStar) { - /* check if the function is in the exceptions */ - hPtr2 = Tcl_FindHashEntry(&starIdmPtr->exceptions, (char *)objv[1]); - if (hPtr2 != NULL) { - const char *sep = ""; - objPtr = Tcl_NewStringObj("unknown subcommand \"", -1); - Tcl_AppendToObj(objPtr, funcName, -1); - Tcl_AppendToObj(objPtr, "\": must be ", -1); - FOREACH_HASH_VALUE(idmPtr, - &iclsPtr->delegatedFunctions) { - funcName = Tcl_GetString(idmPtr->namePtr); - if (strcmp(funcName, "*") != 0) { - if (strlen(sep) > 0) { - Tcl_AppendToObj(objPtr, sep, -1); - } - Tcl_AppendToObj(objPtr, funcName, -1); - sep = " or "; - } - } - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - } - if (hPtr != NULL) { - idmPtr = Tcl_GetHashValue(hPtr); - val = NULL; - if (idmPtr->icPtr != NULL) { - if (idmPtr->icPtr->ivPtr->flags & ITCL_COMMON) { - val = Tcl_GetVar2(interp, - Tcl_GetString(idmPtr->icPtr->namePtr), NULL, 0); - } else { - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - contextIclsPtr = NULL; - contextIoPtr = NULL; - Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr); - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, - Tcl_GetString(contextIoPtr->varNsNamePtr), -1); - Tcl_DStringAppend(&buffer, - Tcl_GetString(idmPtr->icPtr->ivPtr->fullNamePtr), - -1); - val = Tcl_GetVar2(interp, Tcl_DStringValue(&buffer), - NULL, 0); - Tcl_DStringFree(&buffer); - } - if (val == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR: ", - "ItclBiClassUnknownCmd contents ", - "of component == NULL\n", NULL); - return TCL_ERROR; - } - } - offset = 1; - lObjc = 0; - if ((idmPtr->asPtr != NULL) || (idmPtr->usingPtr != NULL)) { - offset++; - listPtr = Tcl_NewListObj(0, NULL); - result = ExpandDelegateAs(interp, NULL, iclsPtr, - idmPtr, funcName, listPtr); - if (result != TCL_OK) { - return result; - } - result = Tcl_ListObjGetElements(interp, listPtr, - &lObjc, &lObjv); - if (result != TCL_OK) { - Tcl_DecrRefCount(listPtr); - return result; - } - if (idmPtr->usingPtr != NULL) { - useComponent = 0; - } - } - if (useComponent) { - if ((val == NULL) || (strlen(val) == 0)) { - Tcl_AppendResult(interp, "component \"", - Tcl_GetString(idmPtr->icPtr->namePtr), - "\" is not initialized", NULL); - return TCL_ERROR; - } - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * - (objc + lObjc - offset + useComponent)); - if (useComponent) { - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - } - for (idx = 0; idx < lObjc; idx++) { - newObjv[useComponent+idx] = lObjv[idx]; - } - if (objc-offset > 0) { - memcpy(newObjv+useComponent+lObjc, objv+offset, - sizeof(Tcl_Obj *) * (objc-offset)); - } - ItclShowArgs(1, "OBJ UK EVAL", objc+lObjc-offset+useComponent, - newObjv); - result = Tcl_EvalObjv(interp, - objc+lObjc-offset+useComponent, newObjv, 0); - if (isStar && (result == TCL_OK)) { - if (Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)newObjv[1]) == NULL) { - result = ItclCreateDelegatedFunction(interp, iclsPtr, - newObjv[1], idmPtr->icPtr, NULL, NULL, - NULL, &idmPtr2); - if (result == TCL_OK) { - if (isTypeMethod) { - idmPtr2->flags |= ITCL_TYPE_METHOD; - } else { - idmPtr2->flags |= ITCL_METHOD; - } - hPtr2 = Tcl_CreateHashEntry( - &iclsPtr->delegatedFunctions, - (char *)newObjv[1], &isNew); - Tcl_SetHashValue(hPtr2, idmPtr2); - } - } - } - if (useComponent) { - Tcl_DecrRefCount(newObjv[0]); - } - ckfree((char *)newObjv); - if (listPtr != NULL) { - Tcl_DecrRefCount(listPtr); - } - if (result == TCL_ERROR) { - resStr = Tcl_GetStringResult(interp); - /* FIXME ugly hack at the moment !! */ - if (strncmp(resStr, "wrong # args: should be ", 24) == 0) { - resPtr = Tcl_NewStringObj("", -1); - Tcl_AppendToObj(resPtr, resStr, 25); - resStr += 25; - Tcl_AppendToObj(resPtr, Tcl_GetString(iclsPtr->namePtr), - -1); - resStr += strlen(val); - Tcl_AppendToObj(resPtr, resStr, -1); - Tcl_ResetResult(interp); - Tcl_SetObjResult(interp, resPtr); - } - } - return result; - } - } - return PrepareCreateObject(interp, iclsPtr, objc, objv); -} - -/* - * ------------------------------------------------------------------------ - * ItclUnknownGuts() - * - * The unknown method handler of the itcl::Root class -- all Itcl - * objects land here when they cannot find a method. - * - * ------------------------------------------------------------------------ - */ - -int -ItclUnknownGuts( - ItclObject *ioPtr, /* The ItclObject seeking method */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Obj **newObjv; - Tcl_Obj **lObjv; - Tcl_Obj *listPtr = NULL; - Tcl_Obj *objPtr; - Tcl_Obj *resPtr; - Tcl_DString buffer; - ItclClass *iclsPtr; - ItclComponent *icPtr; - ItclDelegatedFunction *idmPtr; - ItclDelegatedFunction *idmPtr2; - const char *resStr; - const char *val; - const char *funcName; - int lObjc; - int result; - int offset; - int useComponent; - int found; - int isItclHull; - int isStar; - int isTypeMethod; - int isNew; - int idx; - - if (objc < 2) { - Tcl_AppendResult(interp, "wrong # args: should be one of...", - (char*)NULL); - ItclReportObjectUsage(interp, ioPtr, NULL, NULL); - return TCL_ERROR; - } - iclsPtr = ioPtr->iclsPtr; - lObjc = 0; - offset = 1; - isStar = 0; - found = 0; - isItclHull = 0; - useComponent = 1; - result = TCL_OK; - idmPtr = NULL; - funcName = Tcl_GetString(objv[1]); - if (strcmp(funcName, "itcl_hull") == 0) { - isItclHull = 1; - } - icPtr = NULL; - if (!isItclHull) { - FOREACH_HASH_VALUE(icPtr, &ioPtr->objectComponents) { - if (icPtr->flags & ITCL_COMPONENT_INHERIT) { - val = Itcl_GetInstanceVar(interp, - Tcl_GetString(icPtr->namePtr), ioPtr, - icPtr->ivPtr->iclsPtr); - if ((val != NULL) && (strlen(val) > 0)) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * - (objc)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv+1, objv+1, sizeof(Tcl_Obj *) * (objc-1)); - result = Tcl_EvalObjv(interp, objc, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - return result; - } - } - } - } - isTypeMethod = 0; - found = 0; - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(Tcl_GetString(idmPtr->namePtr), funcName) == 0) { - if (idmPtr->flags & ITCL_TYPE_METHOD) { - isTypeMethod = 1; - } - found = 1; - break; - } - if (strcmp(Tcl_GetString(idmPtr->namePtr), "*") == 0) { - if (idmPtr->flags & ITCL_TYPE_METHOD) { - isTypeMethod = 1; - } - found = 1; - break; - } - } - if (! found) { - idmPtr = NULL; - } - iclsPtr = ioPtr->iclsPtr; - found = 0; - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, (char *)objv[1]); - if (hPtr == NULL) { - objPtr = Tcl_NewStringObj("*", -1); - Tcl_IncrRefCount(objPtr); - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - idmPtr = Tcl_GetHashValue(hPtr); - isStar = 1; - } - } else { - found = 1; - idmPtr = Tcl_GetHashValue(hPtr); - } - if (isStar) { - /* check if the function is in the exceptions */ - hPtr2 = Tcl_FindHashEntry(&idmPtr->exceptions, (char *)objv[1]); - if (hPtr2 != NULL) { - const char *sep = ""; - objPtr = Tcl_NewStringObj("unknown subcommand \"", -1); - Tcl_AppendToObj(objPtr, funcName, -1); - Tcl_AppendToObj(objPtr, "\": must be ", -1); - FOREACH_HASH_VALUE(idmPtr, - &iclsPtr->delegatedFunctions) { - funcName = Tcl_GetString(idmPtr->namePtr); - if (strcmp(funcName, "*") != 0) { - if (strlen(sep) > 0) { - Tcl_AppendToObj(objPtr, sep, -1); - } - Tcl_AppendToObj(objPtr, funcName, -1); - sep = " or "; - } - } - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - } - val = NULL; - if ((idmPtr != NULL) && (idmPtr->icPtr != NULL)) { - Tcl_Obj *objPtr; - /* we cannot use Itcl_GetInstanceVar here as the object is not - * yet completely built. So use the varNsNamePtr - */ - if (idmPtr->icPtr->ivPtr->flags & ITCL_COMMON) { - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr, - (Tcl_GetObjectNamespace(iclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, - Tcl_GetString(idmPtr->icPtr->namePtr), -1); - val = Tcl_GetVar2(interp, Tcl_GetString(objPtr), NULL, 0); - Tcl_DecrRefCount(objPtr); - } else { - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, - Tcl_GetString(ioPtr->varNsNamePtr), -1); - Tcl_DStringAppend(&buffer, - Tcl_GetString(idmPtr->icPtr->ivPtr->fullNamePtr), -1); - val = Tcl_GetVar2(interp, Tcl_DStringValue(&buffer), - NULL, 0); - Tcl_DStringFree(&buffer); - } - - if (val == NULL) { - Tcl_AppendResult(interp, "ItclBiObjectUnknownCmd contents of ", - "component == NULL\n", NULL); - return TCL_ERROR; - } - } - - offset = 1; - if (isStar) { - hPtr = Tcl_FindHashEntry(&idmPtr->exceptions, (char *)objv[1]); - /* we have no method name in that case in the caller */ - if (hPtr != NULL) { - const char *sep = ""; - objPtr = Tcl_NewStringObj("unknown subcommand \"", -1); - Tcl_AppendToObj(objPtr, funcName, -1); - Tcl_AppendToObj(objPtr, "\": must be ", -1); - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - funcName = Tcl_GetString(idmPtr->namePtr); - if (strcmp(funcName, "*") != 0) { - if (strlen(sep) > 0) { - Tcl_AppendToObj(objPtr, sep, -1); - } - Tcl_AppendToObj(objPtr, funcName, -1); - sep = " or "; - } - } - } - } - if (idmPtr == NULL) { - Tcl_AppendResult(interp, "bad option \"", Tcl_GetString(objv[1]), - "\": should be one of...", (char*)NULL); - ItclReportObjectUsage(interp, ioPtr, NULL, NULL); - return TCL_ERROR; - } - lObjc = 0; - if ((idmPtr != NULL) && ((idmPtr->asPtr != NULL) || - (idmPtr->usingPtr != NULL))) { - offset++; - listPtr = Tcl_NewListObj(0, NULL); - result = ExpandDelegateAs(interp, NULL, iclsPtr, - idmPtr, funcName, listPtr); - if (result != TCL_OK) { - Tcl_DecrRefCount(listPtr); - return result; - } - result = Tcl_ListObjGetElements(interp, listPtr, - &lObjc, &lObjv); - if (result != TCL_OK) { - Tcl_DecrRefCount(listPtr); - return result; - } - if (idmPtr->usingPtr != NULL) { - useComponent = 0; - } - } - if (useComponent) { - if ((val == NULL) || (strlen(val) == 0)) { - Tcl_AppendResult(interp, "component \"", - Tcl_GetString(idmPtr->icPtr->namePtr), - "\" is not initialized", NULL); - return TCL_ERROR; - } - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * - (objc + lObjc - offset + useComponent)); - if (useComponent) { - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - } - for (idx = 0; idx < lObjc; idx++) { - newObjv[useComponent+idx] = lObjv[idx]; - } - if (objc-offset > 0) { - memcpy(newObjv+useComponent+lObjc, objv+offset, - sizeof(Tcl_Obj *) * (objc-offset)); - } - ItclShowArgs(1, "UK EVAL2", objc+lObjc-offset+useComponent, - newObjv); - result = Tcl_EvalObjv(interp, objc+lObjc-offset+useComponent, - newObjv, 0); - if (isStar && (result == TCL_OK)) { - if (Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)newObjv[1]) == NULL) { - result = ItclCreateDelegatedFunction(interp, iclsPtr, - newObjv[1], idmPtr->icPtr, NULL, NULL, - NULL, &idmPtr2); - if (result == TCL_OK) { - if (isTypeMethod) { - idmPtr2->flags |= ITCL_TYPE_METHOD; - } else { - idmPtr2->flags |= ITCL_METHOD; - } - hPtr2 = Tcl_CreateHashEntry( - &iclsPtr->delegatedFunctions, (char *)newObjv[1], - &isNew); - Tcl_SetHashValue(hPtr2, idmPtr2); - } - } - } - if (useComponent) { - Tcl_DecrRefCount(newObjv[0]); - } - if (listPtr != NULL) { - Tcl_DecrRefCount(listPtr); - } - ckfree((char *)newObjv); - if (result == TCL_OK) { - return TCL_OK; - } - resStr = Tcl_GetStringResult(interp); - /* FIXME ugly hack at the moment !! */ - if (strncmp(resStr, "wrong # args: should be ", 24) == 0) { - resPtr = Tcl_NewStringObj("", -1); - Tcl_AppendToObj(resPtr, resStr, 25); - resStr += 25; - Tcl_AppendToObj(resPtr, Tcl_GetString(iclsPtr->namePtr), -1); - resStr += strlen(val); - Tcl_AppendToObj(resPtr, resStr, -1); - Tcl_ResetResult(interp); - Tcl_SetObjResult(interp, resPtr); - } - return result; -} - -static Tcl_Obj *makeAsOptionInfo( - Tcl_Interp *interp, - Tcl_Obj *optNamePtr, - ItclDelegatedOption *idoPtr, - int lObjc2, - Tcl_Obj * const *lObjv2) -{ - Tcl_Obj *objPtr; - int j; - - objPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj( - Tcl_GetString(optNamePtr), -1)); - Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj( - Tcl_GetString(idoPtr->resourceNamePtr), -1)); - Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj( - Tcl_GetString(idoPtr->classNamePtr), -1)); - for (j = 3; j < lObjc2; j++) { - Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj( - Tcl_GetString(lObjv2[j]), -1)); - } - return objPtr; -} - -/* - * ------------------------------------------------------------------------ - * ItclExtendedConfigure() - * - * Invoked whenever the user issues the "configure" method for an object. - * If the class is not ITCL_CLASS - * Handles the following syntax: - * - * <objName> configure ?-<option>? ?<value> -<option> <value>...? - * - * Allows access to public variables as if they were configuration - * options. With no arguments, this command returns the current - * list of public variable options. If -<option> is specified, - * this returns the information for just one option: - * - * -<optionName> <initVal> <currentVal> - * - * Otherwise, the list of arguments is parsed, and values are - * assigned to the various public variable options. When each - * option changes, a big of "config" code associated with the option - * is executed, to bring the object up to date. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -ItclExtendedConfigure( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashTable unique; - Tcl_HashEntry *hPtr2; - Tcl_HashEntry *hPtr3; - Tcl_Object oPtr; - Tcl_Obj *listPtr; - Tcl_Obj *listPtr2; - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_Obj *optNamePtr; - Tcl_Obj *methodNamePtr; - Tcl_Obj *configureMethodPtr; - Tcl_Obj **lObjv; - Tcl_Obj **newObjv; - Tcl_Obj *lObjvOne[1]; - Tcl_Obj **lObjv2; - Tcl_Obj **lObjv3; - Tcl_Namespace *saveNsPtr; - Tcl_Namespace *evalNsPtr; - ItclClass *contextIclsPtr; - ItclClass *iclsPtr2; - ItclComponent *componentIcPtr; - ItclObject *contextIoPtr; - ItclDelegatedFunction *idmPtr; - ItclDelegatedOption *idoPtr; - ItclDelegatedOption *saveIdoPtr; - ItclObject *ioPtr; - ItclComponent *icPtr; - ItclOption *ioptPtr; - ItclObjectInfo *infoPtr; - const char *val; - int lObjc; - int lObjc2; - int lObjc3; - int i; - int j; - int isNew; - int result; - int isOneOption; - - ItclShowArgs(1, "ItclExtendedConfigure", objc, objv); - ioptPtr = NULL; - optNamePtr = NULL; - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be ", - "\"object configure ?-option? ?value -option value...?\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * BE CAREFUL: work in the virtual scope! - */ - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - if (infoPtr->currContextIclsPtr != NULL) { - contextIclsPtr = infoPtr->currContextIclsPtr; - } - - hPtr = NULL; - /* first check if method configure is delegated */ - methodNamePtr = Tcl_NewStringObj("*", -1); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, (char *) - methodNamePtr); - if (hPtr != NULL) { - /* all methods are delegated */ - idmPtr = (ItclDelegatedFunction *)Tcl_GetHashValue(hPtr); - Tcl_SetStringObj(methodNamePtr, "configure", -1); - hPtr = Tcl_FindHashEntry(&idmPtr->exceptions, (char *)methodNamePtr); - if (hPtr == NULL) { - icPtr = idmPtr->icPtr; - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, contextIclsPtr); - if (val != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+5)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("configure", -1); - Tcl_IncrRefCount(newObjv[1]); - for(i=1;i<objc;i++) { - newObjv[i+1] = objv[i]; - } - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - oPtr = Tcl_GetObjectFromObj(interp, objPtr); - if (oPtr != NULL) { - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - infoPtr->currContextIclsPtr = ioPtr->iclsPtr; - } - ItclShowArgs(1, "EXTENDED CONFIGURE EVAL1", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - ckfree((char *)newObjv); - Tcl_DecrRefCount(objPtr); - if (oPtr != NULL) { - infoPtr->currContextIclsPtr = NULL; - } - Tcl_DecrRefCount(methodNamePtr); - return result; - } - } else { - /* configure is not delegated, so reset hPtr for checks later on! */ - hPtr = NULL; - } - } - Tcl_DecrRefCount(methodNamePtr); - /* now do the hard work */ - if (objc == 1) { - Tcl_InitObjHashTable(&unique); - /* plain configure */ - listPtr = Tcl_NewListObj(0, NULL); - if (contextIclsPtr->flags & ITCL_ECLASS) { - result = Tcl_EvalEx(interp, "::itcl::builtin::getEclassOptions", -1, 0); - return result; - } - FOREACH_HASH_VALUE(ioptPtr, &contextIoPtr->objectOptions) { - hPtr2 = Tcl_CreateHashEntry(&unique, - (char *)ioptPtr->namePtr, &isNew); - if (!isNew) { - continue; - } - objPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, objPtr, - Tcl_NewStringObj(Tcl_GetString(ioptPtr->namePtr), -1)); - Tcl_ListObjAppendElement(interp, objPtr, - Tcl_NewStringObj( - Tcl_GetString(ioptPtr->resourceNamePtr), -1)); - Tcl_ListObjAppendElement(interp, objPtr, - Tcl_NewStringObj(Tcl_GetString(ioptPtr->classNamePtr), -1)); - if (ioptPtr->defaultValuePtr != NULL) { - Tcl_ListObjAppendElement(interp, objPtr, Tcl_NewStringObj( - Tcl_GetString(ioptPtr->defaultValuePtr), -1)); - } else { - Tcl_ListObjAppendElement(interp, objPtr, - Tcl_NewStringObj("", -1)); - } - val = ItclGetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), contextIoPtr, - contextIclsPtr); - if (val == NULL) { - val = "<undefined>"; - } - Tcl_ListObjAppendElement(interp, objPtr, - Tcl_NewStringObj(val, -1)); - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - /* now check for delegated options */ - FOREACH_HASH_VALUE(idoPtr, &contextIoPtr->objectDelegatedOptions) { - - if (idoPtr->icPtr != NULL) { - icPtr = idoPtr->icPtr; - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, icPtr->ivPtr->iclsPtr); - if ((val != NULL) && (strlen(val) != 0)) { - - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - Tcl_AppendToObj(objPtr, " configure ", -1); - isOneOption = 0; - if (strcmp(Tcl_GetString(idoPtr->namePtr), "*") != 0) { - Tcl_AppendToObj(objPtr, " ", -1); - if (idoPtr->asPtr != NULL) { - Tcl_AppendToObj(objPtr, Tcl_GetString( - idoPtr->asPtr), -1); - } else { - Tcl_AppendToObj(objPtr, Tcl_GetString( - idoPtr->namePtr), -1); - } - isOneOption = 1; - } - result = Tcl_EvalObjEx(interp, objPtr, 0); - Tcl_DecrRefCount(objPtr); - if (result != TCL_OK) { - return TCL_ERROR; - } - listPtr2 = Tcl_GetObjResult(interp); - if (isOneOption) { - lObjc = 1; - lObjvOne[0] = listPtr2; - lObjv = &lObjvOne[0]; - } else { - Tcl_ListObjGetElements(interp, listPtr2, - &lObjc, &lObjv); - } - for (i = 0; i < lObjc; i++) { - objPtr = lObjv[i]; - Tcl_ListObjGetElements(interp, objPtr, - &lObjc2, &lObjv2); - optNamePtr = idoPtr->namePtr; - if (lObjc2 == 0) { - hPtr = NULL; - } else { - hPtr = Tcl_FindHashEntry(&idoPtr->exceptions, - (char *)lObjv2[0]); - if (isOneOption) { - /* avoid wrong name where asPtr != NULL */ - optNamePtr = idoPtr->namePtr; - } else { - optNamePtr = lObjv2[0]; - } - } - if ((hPtr == NULL) && (lObjc2 > 0)) { - if (icPtr->haveKeptOptions) { - hPtr = Tcl_FindHashEntry(&icPtr->keptOptions, - (char *)optNamePtr); - if (hPtr == NULL) { - if (idoPtr->asPtr != NULL) { - if (strcmp(Tcl_GetString(idoPtr->asPtr), - Tcl_GetString(lObjv2[0])) == 0) { - hPtr = Tcl_FindHashEntry( - &icPtr->keptOptions, - (char *)optNamePtr); - if (hPtr == NULL) { - /* not in kept list, so ignore */ - continue; - } - objPtr = makeAsOptionInfo(interp, - optNamePtr, idoPtr, lObjc2, - lObjv2); - } - } - } - if (hPtr != NULL) { - hPtr2 = Tcl_CreateHashEntry(&unique, - (char *)optNamePtr, &isNew); - if (!isNew) { - continue; - } - /* add the option */ - if (idoPtr->asPtr != NULL) { - objPtr = makeAsOptionInfo(interp, - optNamePtr, idoPtr, lObjc2, - lObjv2); - } - Tcl_ListObjAppendElement(interp, listPtr, - objPtr); - } - } else { - Tcl_ListObjGetElements(interp, lObjv2[i], - &lObjc3, &lObjv3); - hPtr2 = Tcl_CreateHashEntry(&unique, - (char *)lObjv3[0], &isNew); - if (!isNew) { - continue; - } - /* add the option */ - if (idoPtr->asPtr != NULL) { - objPtr = makeAsOptionInfo(interp, - optNamePtr, idoPtr, lObjc2, - lObjv2); - } - Tcl_ListObjAppendElement(interp, listPtr, - objPtr); - } - } - } - } - } - } - Tcl_SetObjResult(interp, listPtr); - Tcl_DeleteHashTable(&unique); - return TCL_OK; - } - hPtr2 = NULL; - /* first handle delegated options */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, (char *) - objv[1]); - if (hPtr == NULL) { - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj("*",1); - Tcl_IncrRefCount(objPtr); - /* check if all options are delegated */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, - (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - /* now check the exceptions */ - idoPtr = (ItclDelegatedOption *)Tcl_GetHashValue(hPtr); - hPtr2 = Tcl_FindHashEntry(&idoPtr->exceptions, (char *)objv[1]); - if (hPtr2 != NULL) { - /* found in exceptions, so no delegation for this option */ - hPtr = NULL; - } - } - } - componentIcPtr = NULL; - /* check if it is not a local option defined before delegate option "*" - */ - hPtr2 = Tcl_FindHashEntry(&contextIoPtr->objectOptions, - (char *)objv[1]); - if (hPtr != NULL) { - idoPtr = (ItclDelegatedOption *)Tcl_GetHashValue(hPtr); - icPtr = idoPtr->icPtr; - if (icPtr != NULL) { - if (icPtr->haveKeptOptions) { - hPtr3 = Tcl_FindHashEntry(&icPtr->keptOptions, (char *)objv[1]); - if (hPtr3 != NULL) { - /* ignore if it is an object option only */ - ItclHierIter hier; - int found; - - found = 0; - Itcl_InitHierIter(&hier, contextIoPtr->iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - if (Tcl_FindHashEntry(&iclsPtr2->options, - (char *)objv[1]) != NULL) { - found = 1; - break; - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - if (! found) { - hPtr2 = NULL; - componentIcPtr = icPtr; - } - } - } - } - } - if ((objc <= 3) && (hPtr != NULL) && (hPtr2 == NULL)) { - /* the option is delegated */ - idoPtr = (ItclDelegatedOption *)Tcl_GetHashValue(hPtr); - if (componentIcPtr != NULL) { - icPtr = componentIcPtr; - } else { - icPtr = idoPtr->icPtr; - } - val = ItclGetInstanceVar(interp, - Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, icPtr->ivPtr->iclsPtr); - if ((val != NULL) && (strlen(val) > 0)) { - if (idoPtr->asPtr != NULL) { - icPtr->ivPtr->iclsPtr->infoPtr->currIdoPtr = idoPtr; - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+2)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("configure", 9); - Tcl_IncrRefCount(newObjv[1]); - if (idoPtr->asPtr != NULL) { - newObjv[2] = idoPtr->asPtr; - } else { - newObjv[2] = objv[1]; - } - Tcl_IncrRefCount(newObjv[2]); - for(i=2;i<objc;i++) { - newObjv[i+1] = objv[i]; - } - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - oPtr = Tcl_GetObjectFromObj(interp, objPtr); - if (oPtr != NULL) { - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - infoPtr->currContextIclsPtr = ioPtr->iclsPtr; - } - Tcl_DecrRefCount(objPtr); - ItclShowArgs(1, "extended eval delegated option", objc + 1, - newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - icPtr->ivPtr->iclsPtr->infoPtr->currIdoPtr = NULL; - if (oPtr != NULL) { - infoPtr->currContextIclsPtr = NULL; - } - return result; - } else { - Tcl_AppendResult(interp, "INTERNAL ERROR component \"", - Tcl_GetString(icPtr->namePtr), "\" not found", - " or not set in ItclExtendedConfigure delegated option", - NULL); - return TCL_ERROR; - } - } - - if (objc == 2) { - saveIdoPtr = infoPtr->currIdoPtr; - /* now look if it is an option at all */ - if (hPtr2 == NULL) { - hPtr2 = Tcl_FindHashEntry(&contextIclsPtr->options, - (char *) objv[1]); - if (hPtr2 == NULL) { - hPtr2 = Tcl_FindHashEntry(&contextIoPtr->objectOptions, - (char *) objv[1]); - } else { - infoPtr->currIdoPtr = NULL; - } - } - if (hPtr2 == NULL) { - if (contextIclsPtr->flags & ITCL_ECLASS) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc)); - newObjv[0] = Tcl_NewStringObj("::itcl::builtin::eclassConfigure", -1); - Tcl_IncrRefCount(newObjv[0]); - for (j = 1; j < objc; j++) { - newObjv[j] = objv[j]; - Tcl_IncrRefCount(newObjv[j]); - } - result = Tcl_EvalObjv(interp, objc, newObjv, TCL_EVAL_DIRECT); - for (j = 0; j < objc; j++) { - Tcl_DecrRefCount(newObjv[j]); - } - ckfree((char *)newObjv); - if (result == TCL_OK) { - return TCL_OK; - } - } - /* no option at all, let the normal configure do the job */ - infoPtr->currIdoPtr = saveIdoPtr; - return TCL_CONTINUE; - } - ioptPtr = (ItclOption *)Tcl_GetHashValue(hPtr2); - resultPtr = ItclReportOption(interp, ioptPtr, contextIoPtr); - infoPtr->currIdoPtr = saveIdoPtr; - Tcl_SetResult(interp, Tcl_GetString(resultPtr), TCL_VOLATILE); - Tcl_DecrRefCount(resultPtr); - return TCL_OK; - } - result = TCL_OK; - /* set one or more options */ - for (i=1; i < objc; i+=2) { - if (i+1 >= objc) { - Tcl_AppendResult(interp, "need option value pair", NULL); - result = TCL_ERROR; - break; - } - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectOptions, - (char *) objv[i]); - if (hPtr == NULL) { - if (contextIclsPtr->flags & ITCL_ECLASS) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc)); - newObjv[0] = Tcl_NewStringObj("::itcl::builtin::eclassConfigure", -1); - Tcl_IncrRefCount(newObjv[0]); - for (j = 1; j < objc; j++) { - newObjv[j] = objv[j]; - Tcl_IncrRefCount(newObjv[j]); - } - result = Tcl_EvalObjv(interp, objc, newObjv, TCL_EVAL_DIRECT); - for (j = 0; j < objc; j++) { - Tcl_DecrRefCount(newObjv[j]); - } - ckfree((char *)newObjv); - if (result == TCL_OK) { - continue; - } - } - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, - (char *) objv[i]); - if (hPtr != NULL) { - /* the option is delegated */ - idoPtr = (ItclDelegatedOption *)Tcl_GetHashValue(hPtr); - icPtr = idoPtr->icPtr; - val = ItclGetInstanceVar(interp, - Tcl_GetString(icPtr->ivPtr->namePtr), - NULL, contextIoPtr, icPtr->ivPtr->iclsPtr); - if ((val != NULL) && (strlen(val) > 0)) { - if (idoPtr->asPtr != NULL) { - icPtr->ivPtr->iclsPtr->infoPtr->currIdoPtr = idoPtr; - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+2)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("configure", 9); - Tcl_IncrRefCount(newObjv[1]); - if (idoPtr->asPtr != NULL) { - newObjv[2] = idoPtr->asPtr; - } else { - newObjv[2] = objv[i]; - } - Tcl_IncrRefCount(newObjv[2]); - newObjv[3] = objv[i+1]; - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - oPtr = Tcl_GetObjectFromObj(interp, objPtr); - if (oPtr != NULL) { - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - infoPtr->currContextIclsPtr = ioPtr->iclsPtr; - } - Tcl_DecrRefCount(objPtr); - ItclShowArgs(1, "extended eval delegated option", 4, - newObjv); - result = Tcl_EvalObjv(interp, 4, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - icPtr->ivPtr->iclsPtr->infoPtr->currIdoPtr = NULL; - if (oPtr != NULL) { - infoPtr->currContextIclsPtr = NULL; - } - continue; - } else { - Tcl_AppendResult(interp, "INTERNAL ERROR component not ", - "found or not set in ItclExtendedConfigure ", - "delegated option", NULL); - return TCL_ERROR; - } - } - } - if (hPtr == NULL) { - infoPtr->unparsedObjc += 2; - if (infoPtr->unparsedObjv == NULL) { - infoPtr->unparsedObjc++; /* keep the first slot for - correct working !! */ - infoPtr->unparsedObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) - *(infoPtr->unparsedObjc)); - infoPtr->unparsedObjv[0] = objv[0]; - } else { - infoPtr->unparsedObjv = (Tcl_Obj **)ckrealloc( - (char *)infoPtr->unparsedObjv, sizeof(Tcl_Obj *) - *(infoPtr->unparsedObjc)); - } - infoPtr->unparsedObjv[infoPtr->unparsedObjc-2] = objv[i]; - Tcl_IncrRefCount(infoPtr->unparsedObjv[infoPtr->unparsedObjc-2]); - infoPtr->unparsedObjv[infoPtr->unparsedObjc-1] = objv[i+1]; - /* check if normal public variable/common ? */ - /* FIXME !!! temporary */ - continue; - } - ioptPtr = (ItclOption *)Tcl_GetHashValue(hPtr); - if (ioptPtr->flags & ITCL_OPTION_READONLY) { - if (infoPtr->currIoPtr == NULL) { - /* allow only setting during instance creation - * infoPtr->currIoPtr != NULL during instance creation - */ - Tcl_AppendResult(interp, "option \"", - Tcl_GetString(ioptPtr->namePtr), - "\" can only be set at instance creation", NULL); - return TCL_ERROR; - } - } - if (ioptPtr->validateMethodPtr != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * 3); - newObjv[0] = ioptPtr->validateMethodPtr; - newObjv[1] = objv[i]; - newObjv[2] = objv[i+1]; - infoPtr->inOptionHandling = 1; - saveNsPtr = Tcl_GetCurrentNamespace(interp); - Itcl_SetCallFrameNamespace(interp, contextIclsPtr->nsPtr); - ItclShowArgs(1, "EVAL validatemethod", 3, newObjv); - result = Tcl_EvalObjv(interp, 3, newObjv, TCL_EVAL_DIRECT); - Itcl_SetCallFrameNamespace(interp, saveNsPtr); - infoPtr->inOptionHandling = 0; - ckfree((char *)newObjv); - if (result != TCL_OK) { - break; - } - } - configureMethodPtr = NULL; - evalNsPtr = NULL; - if (ioptPtr->configureMethodPtr != NULL) { - configureMethodPtr = ioptPtr->configureMethodPtr; - Tcl_IncrRefCount(configureMethodPtr); - evalNsPtr = ioptPtr->iclsPtr->nsPtr; - } - if (ioptPtr->configureMethodVarPtr != NULL) { - val = ItclGetInstanceVar(interp, - Tcl_GetString(ioptPtr->configureMethodVarPtr), NULL, - contextIoPtr, ioptPtr->iclsPtr); - if (val == NULL) { - Tcl_AppendResult(interp, "configure cannot get value for", - " configuremethodvar \"", - Tcl_GetString(ioptPtr->configureMethodVarPtr), - "\"", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(val, -1); - hPtr = Tcl_FindHashEntry(&contextIoPtr->iclsPtr->resolveCmds, - (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - ItclMemberFunc *imPtr; - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - evalNsPtr = imPtr->iclsPtr->nsPtr; - } else { - Tcl_AppendResult(interp, "cannot find method \"", - val, "\" found in configuremethodvar", NULL); - return TCL_ERROR; - } - configureMethodPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(configureMethodPtr); - } - if (configureMethodPtr != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*3); - newObjv[0] = configureMethodPtr; - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = objv[i]; - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = objv[i+1]; - Tcl_IncrRefCount(newObjv[2]); - saveNsPtr = Tcl_GetCurrentNamespace(interp); - Itcl_SetCallFrameNamespace(interp, evalNsPtr); - ItclShowArgs(1, "EVAL configuremethod", 3, newObjv); - result = Tcl_EvalObjv(interp, 3, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - ckfree((char *)newObjv); - Itcl_SetCallFrameNamespace(interp, saveNsPtr); - Tcl_DecrRefCount(configureMethodPtr); - if (result != TCL_OK) { - break; - } - } else { - if (ItclSetInstanceVar(interp, "itcl_options", - Tcl_GetString(objv[i]), Tcl_GetString(objv[i+1]), - contextIoPtr, ioptPtr->iclsPtr) == NULL) { - result = TCL_ERROR; - break; - } - } - Tcl_ResetResult(interp); - result = TCL_OK; - } - if (infoPtr->unparsedObjc > 0) { - if (result == TCL_OK) { - return TCL_CONTINUE; - } - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclExtendedCget() - * - * Invoked whenever the user issues the "cget" method for an object. - * If the class is NOT ITCL_CLASS - * Handles the following syntax: - * - * <objName> cget -<option> - * - * Allows access to public variables as if they were configuration - * options. Mimics the behavior of the usual "cget" method for - * Tk widgets. Returns the current value of the public variable - * with name <option>. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -ItclExtendedCget( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_HashEntry *hPtr2; - Tcl_HashEntry *hPtr3; - Tcl_Obj *objPtr2; - Tcl_Obj *objPtr; - Tcl_Object oPtr; - Tcl_Obj *methodNamePtr; - Tcl_Obj **newObjv; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclDelegatedFunction *idmPtr; - ItclDelegatedOption *idoPtr; - ItclComponent *icPtr; - ItclObjectInfo *infoPtr; - ItclOption *ioptPtr; - ItclObject *ioPtr; - const char *val; - int i; - int result; - - ItclShowArgs(1,"ItclExtendedCget", objc, objv); - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if ((contextIoPtr == NULL) || objc != 2) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be \"object cget -option\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * BE CAREFUL: work in the virtual scope! - */ - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - if (infoPtr->currContextIclsPtr != NULL) { - contextIclsPtr = infoPtr->currContextIclsPtr; - } - - hPtr = NULL; - /* first check if method cget is delegated */ - methodNamePtr = Tcl_NewStringObj("*", -1); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, (char *) - methodNamePtr); - if (hPtr != NULL) { - idmPtr = (ItclDelegatedFunction *)Tcl_GetHashValue(hPtr); - Tcl_SetStringObj(methodNamePtr, "cget", -1); - hPtr = Tcl_FindHashEntry(&idmPtr->exceptions, (char *)methodNamePtr); - if (hPtr == NULL) { - icPtr = idmPtr->icPtr; - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, contextIclsPtr); - if (val != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+1)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("cget", 4); - Tcl_IncrRefCount(newObjv[1]); - for(i=1;i<objc;i++) { - newObjv[i+1] = objv[i]; - } - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - oPtr = Tcl_GetObjectFromObj(interp, objPtr); - if (oPtr != NULL) { - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - infoPtr->currContextIclsPtr = ioPtr->iclsPtr; - } - ItclShowArgs(1, "DELEGATED EVAL", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(objPtr); - if (oPtr != NULL) { - infoPtr->currContextIclsPtr = NULL; - } - Tcl_DecrRefCount(methodNamePtr); - return result; - } - } - } - Tcl_DecrRefCount(methodNamePtr); - if (objc == 1) { - Tcl_WrongNumArgs(interp, 1, objv, "option"); - return TCL_ERROR; - } - /* now do the hard work */ - /* first handle delegated options */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, (char *) - objv[1]); - hPtr3 = Tcl_FindHashEntry(&contextIoPtr->objectOptions, (char *) - objv[1]); - hPtr2 = NULL; - if (hPtr == NULL) { - objPtr2 = Tcl_NewStringObj("*", -1); - /* check for "*" option delegated */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, (char *) - objPtr2); - Tcl_DecrRefCount(objPtr2); - hPtr2 = Tcl_FindHashEntry(&contextIoPtr->objectOptions, (char *) - objv[1]); - } - if ((hPtr != NULL) && (hPtr2 == NULL) && (hPtr3 == NULL)) { - /* the option is delegated */ - idoPtr = (ItclDelegatedOption *)Tcl_GetHashValue(hPtr); - /* if the option is in the exceptions, do nothing */ - hPtr = Tcl_FindHashEntry(&idoPtr->exceptions, (char *) - objv[1]); - if (hPtr) { - return TCL_CONTINUE; - } - icPtr = idoPtr->icPtr; - if (icPtr->ivPtr->flags & ITCL_COMMON) { - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, icPtr->ivPtr->iclsPtr); - } else { - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, contextIoPtr, icPtr->ivPtr->iclsPtr); - } - if ((val != NULL) && (strlen(val) > 0)) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+1)); - newObjv[0] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("cget", 4); - Tcl_IncrRefCount(newObjv[1]); - for(i=1;i<objc;i++) { - if (strcmp(Tcl_GetString(idoPtr->namePtr), - Tcl_GetString(objv[i])) == 0) { - if (idoPtr->asPtr != NULL) { - newObjv[i+1] = idoPtr->asPtr; - } else { - newObjv[i+1] = objv[i]; - } - } else { - newObjv[i+1] = objv[i]; - } - } - objPtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(objPtr); - oPtr = Tcl_GetObjectFromObj(interp, objPtr); - if (oPtr != NULL) { - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - infoPtr->currContextIclsPtr = ioPtr->iclsPtr; - } - ItclShowArgs(1, "ExtendedCget delegated option", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(objPtr); - if (oPtr != NULL) { - infoPtr->currContextIclsPtr = NULL; - } - ckfree((char *)newObjv); - return result; - } else { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "component \"", - Tcl_GetString(icPtr->namePtr), - "\" is undefined, needed for option \"", - Tcl_GetString(objv[1]), - "\"", NULL); - return TCL_ERROR; - } - } - - /* now look if it is an option at all */ - if ((hPtr2 == NULL) && (hPtr3 == NULL)) { - /* no option at all, let the normal configure do the job */ - return TCL_CONTINUE; - } - if (hPtr3 != NULL) { - ioptPtr = (ItclOption *)Tcl_GetHashValue(hPtr3); - } else { - ioptPtr = (ItclOption *)Tcl_GetHashValue(hPtr2); - } - result = TCL_CONTINUE; - if (ioptPtr->cgetMethodPtr != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*2); - newObjv[0] = ioptPtr->cgetMethodPtr; - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = objv[1]; - Tcl_IncrRefCount(newObjv[1]); - ItclShowArgs(1, "eval cget method", objc, newObjv); - result = Tcl_EvalObjv(interp, objc, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - } else { - val = ItclGetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), - contextIoPtr, ioptPtr->iclsPtr); - if (val) { - Tcl_SetObjResult(interp, Tcl_NewStringObj(val, -1)); - } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj("<undefined>", -1)); - } - result = TCL_OK; - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclExtendedSetGet() - * - * Invoked whenever the user writes to a methodvariable or calls the method - * with the same name as the variable. - * only for not ITCL_CLASS classes - * Handles the following syntax: - * - * <objName> setget varName ?<value>? - * - * Allows access to methodvariables as if they hat a setter and getter - * method - * With no arguments, this command returns the current - * value of the variable. If <value> is specified, - * this sets the variable to the value calling a callback if exists: - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -ItclExtendedSetGet( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - Tcl_HashEntry *hPtr; - Tcl_Obj **newObjv; - ItclMethodVariable *imvPtr; - ItclObjectInfo *infoPtr; - const char *usageStr; - const char *val; - int result; - int setValue; - - ItclShowArgs(1, "ItclExtendedSetGet", objc, objv); - imvPtr = NULL; - result = TCL_OK; - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - usageStr = "improper usage: should be \"object setget varName ?value?\""; - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - usageStr, (char*)NULL); - return TCL_ERROR; - } - - /* - * BE CAREFUL: work in the virtual scope! - */ - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - if (infoPtr->currContextIclsPtr != NULL) { - contextIclsPtr = infoPtr->currContextIclsPtr; - } - - hPtr = NULL; - if (objc < 2) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - usageStr, (char*)NULL); - return TCL_ERROR; - } - /* look if it is an methodvariable at all */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectMethodVariables, - (char *) objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "no such methodvariable \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - imvPtr = (ItclMethodVariable *)Tcl_GetHashValue(hPtr); - if (objc == 2) { - val = ItclGetInstanceVar(interp, Tcl_GetString(objv[1]), NULL, - contextIoPtr, imvPtr->iclsPtr); - if (val == NULL) { - result = TCL_ERROR; - } else { - Tcl_SetResult(interp, (char *)val, TCL_VOLATILE); - } - return result; - } - imvPtr = (ItclMethodVariable *)Tcl_GetHashValue(hPtr); - result = TCL_OK; - setValue = 1; - if (imvPtr->callbackPtr != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*3); - newObjv[0] = imvPtr->callbackPtr; - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = objv[1]; - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = objv[2]; - Tcl_IncrRefCount(newObjv[2]); - result = Tcl_EvalObjv(interp, 3, newObjv, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - ckfree((char *)newObjv); - } - if (result == TCL_OK) { - Tcl_GetIntFromObj(interp, Tcl_GetObjResult(interp), &setValue); - /* if setValue != 0 set the new value of the variable here */ - if (setValue) { - if (ItclSetInstanceVar(interp, Tcl_GetString(objv[1]), NULL, - Tcl_GetString(objv[2]), contextIoPtr, - imvPtr->iclsPtr) == NULL) { - result = TCL_ERROR; - } - } - } - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiInstallComponentCmd() - * - * Invoked whenever the user issues the "installcomponent" method for an - * object. - * Handles the following syntax: - * - * installcomponent <componentName> using <widgetClassName> <widgetPathName> - * ?-option value -option value ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInstallComponentCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj ** newObjv; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclDelegatedOption *idoPtr; - const char *usageStr; - const char *componentName; - const char *componentValue; - const char *token; - int numOpts; - int result; - - - ItclShowArgs(1, "Itcl_BiInstallComponentCmd", objc, objv); - /* - * Make sure that this command is being invoked in the proper - * context. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "improper usage: should be \"object installcomponent \"", - (char*)NULL); - return TCL_ERROR; - } - if (objc < 5) { - /* FIXME strip off the :: parts here properly*/ - token = Tcl_GetString(objv[0])+2; - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", token, " <componentName> using", - " <widgetClassName> <widgetPathName>", - " ?-option value -option value ...?\"", - (char*)NULL); - return TCL_ERROR; - } - - /* get component name and check, if it exists */ - token = Tcl_GetString(objv[1]); - if (contextIclsPtr == NULL) { - Tcl_AppendResult(interp, "cannot find context class for object \"", - Tcl_GetCommandName(interp, contextIoPtr->accessCmd), "\"", - NULL); - return TCL_ERROR; - } - if (!(contextIclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - Tcl_AppendResult(interp, "no such method \"installcomponent\"", NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&contextIclsPtr->components, (char *)objv[1]); - if (hPtr == NULL) { - numOpts = 0; - FOREACH_HASH_VALUE(idoPtr, &contextIoPtr->objectDelegatedOptions) { - if (idoPtr == NULL) { - /* FIXME need code here !! */ - } - numOpts++; - } - if (numOpts == 0) { - /* there are no delegated options, so no problem that the - * component does not exist. We have nothing to do */ - return TCL_OK; - } - Tcl_AppendResult(interp, "class \"", - Tcl_GetString(contextIclsPtr->namePtr), - "\" has no component \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - if (contextIclsPtr->flags & ITCL_TYPE) { - Tcl_Obj *objPtr; - usageStr = "usage: installcomponent <componentName> using <widgetType> <widgetPath> ?-option value ...?"; - if (objc < 4) { - Tcl_AppendResult(interp, usageStr, NULL); - return TCL_ERROR; - } - if (strcmp(Tcl_GetString(objv[2]), "using") != 0) { - Tcl_AppendResult(interp, usageStr, NULL); - return TCL_ERROR; - } - componentName = Tcl_GetString(objv[1]); - /* as it is no widget, we don't need to check for delegated option */ - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc - 3)); - memcpy(newObjv, objv + 3, sizeof(Tcl_Obj *) * ((objc - 3))); - ItclShowArgs(1, "BiInstallComponent", objc - 3, newObjv); - result = Tcl_EvalObjv(interp, objc - 3, newObjv, 0); - if (result != TCL_OK) { - return result; - } - componentValue = Tcl_GetStringResult(interp); - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr, - (Tcl_GetObjectNamespace(contextIclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, componentName, -1); - - Tcl_SetVar2(interp, Tcl_GetString(objPtr), NULL, componentValue, 0); - - } else { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc + 1)); - newObjv[0] = Tcl_NewStringObj("::itcl::builtin::installcomponent", -1); - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv, objv + 1, sizeof(Tcl_Obj *) * ((objc - 1))); - result = Tcl_EvalObjv(interp, objc, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - return result; - } - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiDestroyCmd() - * - * Invoked whenever the user issues the "destroy" method for an - * object. - * Handles the following syntax: - * - * destroy - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiDestroyCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj **newObjv; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - int result; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiDestroyCmd", objc, objv); - contextIoPtr = NULL; - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIclsPtr == NULL) { - Tcl_AppendResult(interp, "cannot find context class for object \"", - Tcl_GetCommandName(interp, contextIoPtr->accessCmd), "\"", - NULL); - return TCL_ERROR; - } - if ((objc > 1) || !(contextIclsPtr->flags & - (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - /* try to execute destroy in uplevel namespace */ - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc + 2)); - newObjv[0] = Tcl_NewStringObj("uplevel", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("#0", -1); - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = Tcl_NewStringObj("destroy", -1); - Tcl_IncrRefCount(newObjv[2]); - memcpy(newObjv + 3, objv + 1, sizeof(Tcl_Obj *) * (objc - 1)); - ItclShowArgs(1, "DESTROY", objc + 2, newObjv); - result = Tcl_EvalObjv(interp, objc + 2, newObjv, 0); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - return result; - } - if (objc != 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", Tcl_GetString(objv[0]), (char*)NULL); - return TCL_ERROR; - } - - if (contextIoPtr != NULL) { - Tcl_Obj *objPtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, contextIoPtr->accessCmd, objPtr); - Itcl_RenameCommand(interp, Tcl_GetString(objPtr), ""); - Tcl_DecrRefCount(objPtr); - result = TCL_OK; - } else { - result = Itcl_DeleteClass(interp, contextIclsPtr); - } - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiCallInstanceCmd() - * - * Invoked whenever the a script generated by mytypemethod, mymethod or - * myproc is evauated later on: - * Handles the following syntax: - * - * callinstance <instanceName> ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiCallInstanceCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - Tcl_Obj **newObjv; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObject *ioPtr; - const char *token; - int result; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiCallInstanceCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (objc < 2) { - token = Tcl_GetString(objv[0]); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", token, " <instanceName>", - (char*)NULL); - return TCL_ERROR; - } - - hPtr = Tcl_FindHashEntry(&contextIclsPtr->infoPtr->instances, - Tcl_GetString(objv[1])); - if (hPtr == NULL) { - Tcl_AppendResult(interp, - "no such instanceName \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - ioPtr = Tcl_GetHashValue(hPtr); - objPtr =Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*) * (objc - 1)); - newObjv[0] = objPtr; - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv + 1, objv + 2, sizeof(Tcl_Obj *) * (objc - 2)); - result = Tcl_EvalObjv(interp, objc - 1, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiGetInstanceVarCmd() - * - * Invoked whenever the a script generated by mytypevar, myvar or - * mycommon is evauated later on: - * Handles the following syntax: - * - * getinstancevar <instanceName> ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiGetInstanceVarCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - Tcl_Obj **newObjv; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObject *ioPtr; - const char *token; - int result; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiGetInstanceVarCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (objc < 2) { - token = Tcl_GetString(objv[0]); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", token, " <instanceName>", - (char*)NULL); - return TCL_ERROR; - } - - hPtr = Tcl_FindHashEntry(&contextIclsPtr->infoPtr->instances, - Tcl_GetString(objv[1])); - if (hPtr == NULL) { - Tcl_AppendResult(interp, - "no such instanceName \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - ioPtr = Tcl_GetHashValue(hPtr); - objPtr =Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*) * (objc - 1)); - newObjv[0] = objPtr; - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv + 1, objv + 2, sizeof(Tcl_Obj *) * (objc - 2)); - result = Tcl_EvalObjv(interp, objc - 1, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiMyTypeMethodCmd() - * - * Invoked when a user calls mytypemethod - * - * Handles the following syntax: - * - * mytypemethod ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiMyTypeMethodCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr; - Tcl_Obj *resultPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - int i; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiMyTypeMethodCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (objc < 2) { - Tcl_AppendResult(interp, "usage: mytypemethod <name>", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(contextIclsPtr->nsPtr->fullName, -1); - resultPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, resultPtr, objPtr); - - for (i = 1; i < objc; i++) { - Tcl_ListObjAppendElement(interp, resultPtr, objv[i]); - } - Tcl_SetObjResult(interp, resultPtr); - - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiMyMethodCmd() - * - * Invoked when a user calls mymethod - * - * Handles the following syntax: - * - * mymethod ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiMyMethodCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - int i; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiMyMethodCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - resultPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, resultPtr, - Tcl_NewStringObj("::itcl::builtin::callinstance", -1)); - Tcl_ListObjAppendElement(interp, resultPtr, Tcl_NewStringObj( - (Tcl_GetObjectNamespace(contextIoPtr->oPtr))->fullName, -1)); - for (i = 1; i < objc; i++) { - Tcl_ListObjAppendElement(interp, resultPtr, objv[i]); - } - Tcl_SetObjResult(interp, resultPtr); - return TCL_OK; - } - - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiMyProcCmd() - * - * Invoked when a user calls myproc - * - * Handles the following syntax: - * - * myproc ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiMyProcCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr; - Tcl_Obj *resultPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - int i; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiMyProcCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (objc < 2) { - Tcl_AppendResult(interp, "usage: myproc <name>", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(contextIclsPtr->nsPtr->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(objv[1]), -1); - resultPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, resultPtr, objPtr); - - for (i = 2; i < objc; i++) { - Tcl_ListObjAppendElement(interp, resultPtr, objv[i]); - } - Tcl_SetObjResult(interp, resultPtr); - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiMyTypeVarCmd() - * - * Invoked when a user calls mytypevar - * - * Handles the following syntax: - * - * mytypevar ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiMyTypeVarCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr; - Tcl_Obj *resultPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - int i; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiMyTypeVarCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (objc < 2) { - Tcl_AppendResult(interp, "usage: mytypevar <name>", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(contextIclsPtr->nsPtr->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(objv[1]), -1); - resultPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, resultPtr, objPtr); - - for (i = 2; i < objc; i++) { - Tcl_ListObjAppendElement(interp, resultPtr, objv[i]); - } - Tcl_SetObjResult(interp, resultPtr); - - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiMyVarCmd() - * - * Invoked when a user calls myvar - * - * Handles the following syntax: - * - * myvar ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiMyVarCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiMyVarCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - resultPtr = Tcl_NewStringObj(Tcl_GetString(contextIoPtr->varNsNamePtr), - -1); - Tcl_AppendToObj(resultPtr, "::", -1); - Tcl_AppendToObj(resultPtr, Tcl_GetString(contextIclsPtr->namePtr), -1); - Tcl_AppendToObj(resultPtr, "::", -1); - Tcl_AppendToObj(resultPtr, Tcl_GetString(objv[1]), -1); - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_BiItclHullCmd() - * - * Invoked when a user calls itcl_hull - * - * Handles the following syntax: - * - * itcl_hull ?arg arg ...? - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiItclHullCmd( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - const char *val; - - /* - * Make sure that this command is being invoked in the proper - * context. - */ - ItclShowArgs(1, "Itcl_BiItclHullCmd", objc, objv); - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - val = ItclGetInstanceVar(interp, "itcl_hull", NULL, - contextIoPtr, contextIclsPtr); - Tcl_SetObjResult(interp, Tcl_NewStringObj(val, -1)); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiCreateHullCmd() - * - * Invoked by Tcl normally during evaluating constructor - * the "createhull" command is invoked to install and setup an - * ::itcl::extendedclass itcl_hull - * for an object. Handles the following syntax: - * - * createhull <widget_type> <widget_path> ?-class <widgetClassName>? - * ?<optionName> <optionValue> <optionName> <optionValue> ...? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_BiCreateHullCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - - ItclShowArgs(1, "Itcl_BiCreateHullCmd", objc, objv); - if (!infoPtr->itclHullCmdsInitted) { - result = Tcl_EvalEx(interp, initHullCmdsScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclHullCmdsInitted = 1; - } - return Tcl_EvalObjv(interp, objc, objv, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiSetupComponentCmd() - * - * Invoked by Tcl during evaluating constructor whenever - * the "setupcomponent" command is invoked to install and setup an - * ::itcl::extendedclass component - * for an object. Handles the following syntax: - * - * setupcomponent <componentName> using <widgetType> <widget_path> - * ?<optionName> <optionValue> <optionName> <optionValue> ...? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_BiSetupComponentCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - - ItclShowArgs(1, "Itcl_BiSetupComponentCmd", objc, objv); - if (!infoPtr->itclHullCmdsInitted) { - result = Tcl_EvalEx(interp, initHullCmdsScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclHullCmdsInitted = 1; - } - return Tcl_EvalObjv(interp, objc, objv, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInitOptionsCmd() - * - * Invoked by Tcl during evaluating constructor whenever - * the "itcl_initoptions" command is invoked to install and setup an - * ::itcl::extendedclass options - * for an object. Handles the following syntax: - * - * itcl_initoptions - * ?<optionName> <optionValue> <optionName> <optionValue> ...? - * FIXME !!!! seems no longer been used !!! - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_BiInitOptionsCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr; - ItclObject *ioPtr; - ItclDelegatedOption *idoptPtr; - ItclOption *ioptPtr; - FOREACH_HASH_DECLS; - - /* instead ::itcl::builtin::initoptions in ../library/itclHullCmds.tcl is used !! */ - ItclShowArgs(1, "Itcl_BiInitOptionsCmd", objc, objv); - if (!infoPtr->itclHullCmdsInitted) { - result = Tcl_EvalEx(interp, initHullCmdsScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclHullCmdsInitted = 1; - } - result = Tcl_EvalObjv(interp, objc, objv, 0); - iclsPtr = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - /* first handle delegated options */ - FOREACH_HASH_VALUE(idoptPtr, &ioPtr->objectDelegatedOptions) { -fprintf(stderr, "delopt!%s!\n", Tcl_GetString(idoptPtr->namePtr)); - } - FOREACH_HASH_VALUE(ioptPtr, &ioPtr->objectOptions) { -fprintf(stderr, "opt!%s!\n", Tcl_GetString(ioptPtr->namePtr)); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiKeepComponentOptionCmd() - * - * Invoked by Tcl during evaluating constructor whenever - * the "keepcomponentoption" command is invoked to list the options - * to be kept when and ::itcl::extendedclass component has been setup - * for an object. Handles the following syntax: - * - * keepcomponentoption <componentName> <optionName> ?<optionName> ...? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_BiKeepComponentOptionCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - - ItclShowArgs(1, "Itcl_BiKeepComponentOptionCmd", objc, objv); - if (!infoPtr->itclHullCmdsInitted) { - result = Tcl_EvalEx(interp, initHullCmdsScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclHullCmdsInitted = 1; - } - result = Tcl_EvalObjv(interp, objc, objv, 0); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiIgnoreComponentOptionCmd() - * - * Invoked by Tcl during evaluating constructor whenever - * the "keepcomponentoption" command is invoked to list the options - * to be kept when and ::itcl::extendedclass component has been setup - * for an object. Handles the following syntax: - * - * ignorecomponentoption <componentName> <optionName> ?<optionName> ...? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_BiIgnoreComponentOptionCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_HashEntry *hPtr2; - Tcl_Obj *objPtr; - ItclClass *iclsPtr; - ItclObject *ioPtr; - ItclDelegatedOption *idoPtr; - ItclComponent *icPtr; - const char *val; - int idx; - int isNew; - int result; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - - ItclShowArgs(0, "Itcl_BiIgnoreComponentOptionCmd", objc, objv); - if (!infoPtr->itclHullCmdsInitted) { - result = Tcl_Eval(interp, initHullCmdsScript); - if (result != TCL_OK) { - return result; - } - infoPtr->itclHullCmdsInitted = 1; - } - iclsPtr = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (objc < 3) { - Tcl_AppendResult(interp, "wrong # args, should be: ", - "ignorecomponentoption component option ?option ...?", NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectComponents, (char *)objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, - "ignorecomponentoption cannot find component \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - icPtr = Tcl_GetHashValue(hPtr); - icPtr->haveKeptOptions = 1; - for (idx = 2; idx < objc; idx++) { - hPtr = Tcl_CreateHashEntry(&icPtr->keptOptions, (char *)objv[idx], - &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr, objv[idx]); - } - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectDelegatedOptions, - (char *)objv[idx], &isNew); - if (isNew) { - idoPtr = (ItclDelegatedOption *)ckalloc(sizeof( - ItclDelegatedOption)); - memset(idoPtr, 0, sizeof(ItclDelegatedOption)); - Tcl_InitObjHashTable(&idoPtr->exceptions); - idoPtr->namePtr = objv[idx]; - Tcl_IncrRefCount(idoPtr->namePtr); - idoPtr->resourceNamePtr = NULL; - if (idoPtr->resourceNamePtr != NULL) { - Tcl_IncrRefCount(idoPtr->resourceNamePtr); - } - idoPtr->classNamePtr = NULL; - if (idoPtr->classNamePtr != NULL) { - Tcl_IncrRefCount(idoPtr->classNamePtr); - } - idoPtr->icPtr = icPtr; - idoPtr->ioptPtr = NULL; - Tcl_SetHashValue(hPtr2, idoPtr); - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), - NULL, ioPtr, iclsPtr); - if (val != NULL) { - objPtr = Tcl_NewStringObj(val, -1); - Tcl_AppendToObj(objPtr, " cget ", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(objv[idx]), -1); - Tcl_IncrRefCount(objPtr); - result = Tcl_EvalObjEx(interp, objPtr, 0); - Tcl_DecrRefCount(objPtr); - if (result == TCL_OK) { - ItclSetInstanceVar(interp, "itcl_options", - Tcl_GetString(objv[idx]), - Tcl_GetStringResult(interp), ioPtr, iclsPtr); - } - } - } - } - ItclAddClassComponentDictInfo(interp, iclsPtr, icPtr); - } - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclClass.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclClass.c deleted file mode 100644 index af02d6e..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclClass.c +++ /dev/null @@ -1,2640 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * These procedures handle class definitions. Classes are composed of - * data members (public/protected/common) and the member functions - * (methods/procs) that operate on them. Each class has its own - * namespace which manages the class scope. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann Copyright (c) 2007 - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -static Tcl_NamespaceDeleteProc* _TclOONamespaceDeleteProc = NULL; -static void ItclDeleteOption(char *cdata); - -/* - * FORWARD DECLARATIONS - */ -static void ItclDestroyClass(ClientData cdata); -static void ItclFreeClass (char* cdata); -static void ItclDeleteFunction(ItclMemberFunc *imPtr); -static void ItclDeleteComponent(ItclComponent *icPtr); -static void ItclDeleteOption(char *cdata); - -void -ItclPreserveClass( - ItclClass *iclsPtr) -{ - iclsPtr->refCount++; -} - -void -ItclReleaseClass( - ClientData clientData) -{ - ItclClass *iclsPtr = (ItclClass *)clientData; - - if (--iclsPtr->refCount == 0) { - ItclFreeClass((char *) clientData); - } -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteMemberFunc() - * - * ------------------------------------------------------------------------ - */ - -void Itcl_DeleteMemberFunc ( - char *cdata) -{ - /* needed for stubs compatibility */ - ItclMemberFunc *imPtr; - - imPtr = (ItclMemberFunc *)cdata; - if (imPtr == NULL) { - /* FIXME need code here */ - } - ItclDeleteFunction((ItclMemberFunc *)cdata); -} - -/* - * ------------------------------------------------------------------------ - * ItclDestroyClass2() - * - * ------------------------------------------------------------------------ - */ - -static void -ItclDestroyClass2( - ClientData clientData) /* The class being deleted. */ -{ - ItclClass *iclsPtr; - - iclsPtr = clientData; - ItclDestroyClassNamesp(iclsPtr); - ItclReleaseClass(iclsPtr); -} - -/* - * ------------------------------------------------------------------------ - * ClassCmdDeleteTrace() - * - * ------------------------------------------------------------------------ - */ - -static void -ClassCmdDeleteTrace( - ClientData clientData, /* The class being deleted. */ - Tcl_Interp *interp, /* The interpreter containing the object. */ - const char *oldName, /* What the object was (last) called. */ - const char *newName, /* Always NULL. */ - int flags) /* Why was the object deleted? */ -{ - Tcl_HashEntry *hPtr; - Tcl_DString buffer; - Tcl_Namespace *nsPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr = clientData; - - /* - * How is it decided what cleanup is done here tracing the access command deletion, - * versus what cleanup is done by the Tcl_CmdDeleteProc tied to the access command? - */ - - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr); - if (hPtr == NULL) { - return; - } - if (iclsPtr->flags & ITCL_CLASS_IS_RENAMED) { /* DUMB! name for this flag */ - return; /* Flag very likely serves no purpose as well. */ - } - iclsPtr->flags |= ITCL_CLASS_IS_RENAMED; /* DUMB! name for this flag */ - ItclPreserveClass(iclsPtr); - /* delete the namespace for the common variables */ - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(iclsPtr->oPtr))->fullName, -1); - nsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - if (nsPtr != NULL) { - Tcl_DeleteNamespace(nsPtr); - } - if (!(iclsPtr->flags & ITCL_CLASS_NS_IS_DESTROYED)) { - ItclDestroyClassNamesp(iclsPtr); - } - ItclReleaseClass(iclsPtr); - return; -} - - -/* - * ------------------------------------------------------------------------ - * ItclDeleteClassMetadata() - * - * Delete the metadata data if any - *------------------------------------------------------------------------- - */ -void -ItclDeleteClassMetadata( - ClientData clientData) -{ - /* - * This is how we get alerted from TclOO that the object corresponding - * to an Itcl class (or its namespace...) is being torn down. - */ - - ItclClass *iclsPtr = clientData; - Tcl_Object oPtr = iclsPtr->oPtr; - Tcl_Namespace *ooNsPtr = Tcl_GetObjectNamespace(oPtr); - - if (ooNsPtr != iclsPtr->nsPtr) { - /* - * Itcl's idea of the class namespace is different from that of TclOO. - * Make sure both get torn down and pulled from tables. - */ - Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->namespaceClasses, - (char *)ooNsPtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - Tcl_DeleteNamespace(iclsPtr->nsPtr); - } else { - ItclDestroyClass2(iclsPtr); - } - ItclReleaseClass(iclsPtr); -} - -static int -CallNewObjectInstance( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ItclObjectInfo *infoPtr = data[0]; - const char* path = data[1]; - Tcl_Object *oPtr = data[2]; - Tcl_Obj *nameObjPtr = data[3]; - - *oPtr = Tcl_NewObjectInstance(interp, infoPtr->clazzClassPtr, - path, path, 0, NULL, 0); - if (*oPtr == NULL) { - Tcl_AppendResult(interp, - "ITCL: cannot create Tcl_NewObjectInstance for class \"", - Tcl_GetString(nameObjPtr), "\"", NULL); - return TCL_ERROR; - } - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_CreateClass() - * - * Creates a namespace and its associated class definition data. - * If a namespace already exists with that name, then this routine - * returns TCL_ERROR, along with an error message in the interp. - * If successful, it returns TCL_OK and a pointer to the new class - * definition. - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateClass( - Tcl_Interp* interp, /* interpreter that will contain new class */ - const char* path, /* name of new class */ - ItclObjectInfo *infoPtr, /* info for all known objects */ - ItclClass **rPtr) /* returns: pointer to class definition */ -{ - const char *head; - const char *tail; - Tcl_DString buffer; - Tcl_Command cmd; - Tcl_CmdInfo cmdInfo; - Tcl_Namespace *classNs, *ooNs; - Tcl_Object oPtr; - Tcl_Obj *nameObjPtr; - Tcl_Obj *namePtr; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - Tcl_HashEntry *hPtr; - void *callbackPtr; - int result; - int newEntry; - ItclResolveInfo *resolveInfoPtr; - Tcl_Obj *cmdNamePtr; - - /* - * check for an empty class name to avoid a crash - */ - if (strlen(path) == 0) { - Tcl_AppendResult(interp, "invalid class name \"\"", NULL); - return TCL_ERROR; - } - /* - * Make sure that a class with the given name does not - * already exist in the current namespace context. If a - * namespace exists, that's okay. It may have been created - * to contain stubs during a "namespace import" operation. - * We'll just replace the namespace data below with the - * proper class data. - */ - classNs = Tcl_FindNamespace(interp, (const char *)path, - (Tcl_Namespace*)NULL, /* flags */ 0); - - if (classNs != NULL && Itcl_IsClassNamespace(classNs)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "class \"", path, "\" already exists", - (char*)NULL); - return TCL_ERROR; - } - - oPtr = NULL; - /* - * Make sure that a command with the given class name does not - * already exist in the current namespace. This prevents the - * usual Tcl commands from being clobbered when a programmer - * makes a bogus call like "class info". - */ - cmd = Tcl_FindCommand(interp, (const char *)path, - (Tcl_Namespace*)NULL, /* flags */ TCL_NAMESPACE_ONLY); - - if (cmd != NULL && !Itcl_IsStub(cmd)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "command \"", path, "\" already exists", - (char*)NULL); - - if (strstr(path,"::") == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - " in namespace \"", - Tcl_GetCurrentNamespace(interp)->fullName, "\"", - (char*)NULL); - } - return TCL_ERROR; - } - - /* - * Make sure that the class name does not have any goofy - * characters: - * - * . => reserved for member access like: class.publicVar - */ - Itcl_ParseNamespPath(path, &buffer, &head, &tail); - - if (strstr(tail,".")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad class name \"", tail, "\"", - (char*)NULL); - Tcl_DStringFree(&buffer); - return TCL_ERROR; - } - Tcl_DStringFree(&buffer); - - /* - * Allocate class definition data. - */ - iclsPtr = (ItclClass*)ckalloc(sizeof(ItclClass)); - memset(iclsPtr, 0, sizeof(ItclClass)); - iclsPtr->interp = interp; - iclsPtr->infoPtr = infoPtr; - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_InitObjHashTable(&iclsPtr->variables); - Tcl_InitObjHashTable(&iclsPtr->functions); - Tcl_InitObjHashTable(&iclsPtr->options); - Tcl_InitObjHashTable(&iclsPtr->components); - Tcl_InitObjHashTable(&iclsPtr->delegatedOptions); - Tcl_InitObjHashTable(&iclsPtr->delegatedFunctions); - Tcl_InitObjHashTable(&iclsPtr->methodVariables); - Tcl_InitObjHashTable(&iclsPtr->resolveCmds); - - iclsPtr->numInstanceVars = 0; - Tcl_InitHashTable(&iclsPtr->classCommons, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&iclsPtr->resolveVars, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&iclsPtr->contextCache, TCL_ONE_WORD_KEYS); - - Itcl_InitList(&iclsPtr->bases); - Itcl_InitList(&iclsPtr->derived); - - resolveInfoPtr = (ItclResolveInfo *) ckalloc(sizeof(ItclResolveInfo)); - memset (resolveInfoPtr, 0, sizeof(ItclResolveInfo)); - resolveInfoPtr->flags = ITCL_RESOLVE_CLASS; - resolveInfoPtr->iclsPtr = iclsPtr; - iclsPtr->resolvePtr = (Tcl_Resolve *)ckalloc(sizeof(Tcl_Resolve)); - iclsPtr->resolvePtr->cmdProcPtr = Itcl_CmdAliasProc; - iclsPtr->resolvePtr->varProcPtr = Itcl_VarAliasProc; - iclsPtr->resolvePtr->clientData = resolveInfoPtr; - iclsPtr->flags = infoPtr->currClassFlags; - - /* - * Initialize the heritage info--each class starts with its - * own class definition in the heritage. Base classes are - * added to the heritage from the "inherit" statement. - */ - Tcl_InitHashTable(&iclsPtr->heritage, TCL_ONE_WORD_KEYS); - (void) Tcl_CreateHashEntry(&iclsPtr->heritage, (char*)iclsPtr, &newEntry); - - /* - * Create a namespace to represent the class. Add the class - * definition info as client data for the namespace. If the - * namespace already exists, then replace any existing client - * data with the class data. - */ - - ItclPreserveClass(iclsPtr); - - nameObjPtr = Tcl_NewStringObj("", 0); - Tcl_IncrRefCount(nameObjPtr); - if ((path[0] != ':') || (path[1] != ':')) { - Tcl_Namespace *currNsPtr = Tcl_GetCurrentNamespace(interp); - Tcl_AppendToObj(nameObjPtr, currNsPtr->fullName, -1); - if (currNsPtr->parentPtr != NULL) { - Tcl_AppendToObj(nameObjPtr, "::", 2); - } - } - Tcl_AppendToObj(nameObjPtr, path, -1); - { - /* - * TclOO machinery will refuse to overwrite an existing command - * with creation of a new object. However, Itcl has a legacy - * "stubs" auto-importing mechanism that explicitly needs such - * overwriting. So, check whether we have a stub, and if so, - * delete it before TclOO has a chance to object. - */ - Tcl_Command oldCmd = Tcl_FindCommand(interp, path, NULL, 0); - - if (Itcl_IsStub(oldCmd)) { - Tcl_DeleteCommandFromToken(interp, oldCmd); - } - } - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - /* - * Create a command in the current namespace to manage the class: - * <className> - * <className> <objName> ?<constructor-args>? - */ - Tcl_NRAddCallback(interp, CallNewObjectInstance, infoPtr, - (ClientData)path, &oPtr, nameObjPtr); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (result == TCL_ERROR) { - result = TCL_ERROR; - goto errorOut; - } - iclsPtr->clsPtr = Tcl_GetObjectAsClass(oPtr); - iclsPtr->oPtr = oPtr; - ItclPreserveClass(iclsPtr); - Tcl_ObjectSetMetadata(iclsPtr->oPtr, infoPtr->class_meta_type, iclsPtr); - cmd = Tcl_GetObjectCommand(iclsPtr->oPtr); - Tcl_GetCommandInfoFromToken(cmd, &cmdInfo); - cmdInfo.deleteProc = ItclDestroyClass; - cmdInfo.deleteData = iclsPtr; - Tcl_SetCommandInfoFromToken(cmd, &cmdInfo); - ooNs = Tcl_GetObjectNamespace(oPtr); - classNs = Tcl_FindNamespace(interp, Tcl_GetString(nameObjPtr), - (Tcl_Namespace*)NULL, /* flags */ 0); - if (_TclOONamespaceDeleteProc == NULL) { - _TclOONamespaceDeleteProc = ooNs->deleteProc; - } - - if (classNs == NULL) { - Tcl_AppendResult(interp, - "ITCL: cannot create/get class namespace for class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", NULL); - return TCL_ERROR; - } - - if (iclsPtr->infoPtr->useOldResolvers) { -#ifdef NEW_PROTO_RESOLVER - Itcl_SetNamespaceResolvers(ooNs, - (Tcl_ResolveCmdProc*)Itcl_ClassCmdResolver2, - (Tcl_ResolveVarProc*)Itcl_ClassVarResolver2, - (Tcl_ResolveCompiledVarProc*)Itcl_ClassCompiledVarResolver2); - Itcl_SetNamespaceResolvers(classNs, - (Tcl_ResolveCmdProc*)Itcl_ClassCmdResolver2, - (Tcl_ResolveVarProc*)Itcl_ClassVarResolver2, - (Tcl_ResolveCompiledVarProc*)Itcl_ClassCompiledVarResolver2); -#else - Itcl_SetNamespaceResolvers(ooNs, - (Tcl_ResolveCmdProc*)Itcl_ClassCmdResolver, - (Tcl_ResolveVarProc*)Itcl_ClassVarResolver, - (Tcl_ResolveCompiledVarProc*)Itcl_ClassCompiledVarResolver); - Itcl_SetNamespaceResolvers(classNs, - (Tcl_ResolveCmdProc*)Itcl_ClassCmdResolver, - (Tcl_ResolveVarProc*)Itcl_ClassVarResolver, - (Tcl_ResolveCompiledVarProc*)Itcl_ClassCompiledVarResolver); -#endif - } else { - Tcl_SetNamespaceResolver(ooNs, iclsPtr->resolvePtr); - Tcl_SetNamespaceResolver(classNs, iclsPtr->resolvePtr); - } - iclsPtr->nsPtr = classNs; - - - iclsPtr->namePtr = Tcl_NewStringObj(classNs->name, -1); - Tcl_IncrRefCount(iclsPtr->namePtr); - - iclsPtr->fullNamePtr = Tcl_NewStringObj(classNs->fullName, -1); - Tcl_IncrRefCount(iclsPtr->fullNamePtr); - - hPtr = Tcl_CreateHashEntry(&infoPtr->nameClasses, - (char *)iclsPtr->fullNamePtr, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)iclsPtr); - - - hPtr = Tcl_CreateHashEntry(&infoPtr->namespaceClasses, (char *)classNs, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)iclsPtr); - if (classNs != ooNs) { - hPtr = Tcl_CreateHashEntry(&infoPtr->namespaceClasses, (char *)ooNs, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)iclsPtr); - - if (classNs->clientData && classNs->deleteProc) { - (*classNs->deleteProc)(classNs->clientData); - } - classNs->clientData = (ClientData)iclsPtr; - classNs->deleteProc = ItclDestroyClass2; -} - - hPtr = Tcl_CreateHashEntry(&infoPtr->classes, (char *)iclsPtr, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)iclsPtr); - - /* - * now build the namespace for the common private and protected variables - * public variables go directly to the class namespace - */ - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(iclsPtr->oPtr))->fullName, -1); - if ((NULL == Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, - TCL_GLOBAL_ONLY)) && (NULL == Tcl_CreateNamespace(interp, - Tcl_DStringValue(&buffer), NULL, 0))) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "ITCL: cannot create variables namespace \"", - Tcl_DStringValue(&buffer), "\"", NULL); - result = TCL_ERROR; - goto errorOut; - } - - /* - * Add the built-in "this" command to the list of function members. - */ - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_DStringAppend(&buffer, "::this", -1); - iclsPtr->thisCmd = Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer), - Itcl_ThisCmd, iclsPtr, NULL); - - /* - * Add the built-in "type" variable to the list of data members. - */ - if (iclsPtr->flags & ITCL_TYPE) { - namePtr = Tcl_NewStringObj("type", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_TYPE_VAR; /* mark as "type" variable */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - } - - if (iclsPtr->flags & (ITCL_ECLASS)) { - namePtr = Tcl_NewStringObj("win", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_WIN_VAR; /* mark as "win" variable */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - namePtr = Tcl_NewStringObj("self", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_SELF_VAR; /* mark as "self" variable */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - - namePtr = Tcl_NewStringObj("selfns", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_SELFNS_VAR; /* mark as "selfns" variable */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - - namePtr = Tcl_NewStringObj("win", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_WIN_VAR; /* mark as "win" variable */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - } - namePtr = Tcl_NewStringObj("this", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_THIS_VAR; /* mark as "this" variable */ - - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - - if (infoPtr->currClassFlags & - (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET)) { - /* - * Add the built-in "itcl_options" variable to the list of - * data members. - */ - namePtr = Tcl_NewStringObj("itcl_options", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_OPTIONS_VAR; /* mark as "itcl_options" - * variable */ - - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - - } - if (infoPtr->currClassFlags & - ITCL_ECLASS) { - /* - * Add the built-in "itcl_option_components" variable to the list of - * data members. - */ - namePtr = Tcl_NewStringObj("itcl_option_components", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_OPTION_COMP_VAR; /* mark as "itcl_option_components" - * variable */ - - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - - } - if (infoPtr->currClassFlags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - /* - * Add the built-in "thiswin" variable to the list of data members. - */ - namePtr = Tcl_NewStringObj("thiswin", -1); - (void) Itcl_CreateVariable(interp, iclsPtr, namePtr, (char*)NULL, - (char*)NULL, &ivPtr); - - ivPtr->protection = ITCL_PROTECTED; /* always "protected" */ - ivPtr->flags |= ITCL_THIS_VAR; /* mark as "thiswin" variable */ - - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, - &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - } - if (infoPtr->currClassFlags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - /* create the itcl_hull component */ - ItclComponent *icPtr; - namePtr = Tcl_NewStringObj("itcl_hull", 9); - /* itcl_hull must not be an ITCL_COMMON!! */ - if (ItclCreateComponent(interp, iclsPtr, namePtr, 0, &icPtr) != - TCL_OK) { - result = TCL_ERROR; - goto errorOut; - } - } - - ItclPreserveClass(iclsPtr); - iclsPtr->accessCmd = Tcl_GetObjectCommand(oPtr); - - cmdNamePtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, iclsPtr->accessCmd, cmdNamePtr); - - Tcl_TraceCommand(interp, Tcl_GetString(cmdNamePtr), - TCL_TRACE_DELETE, ClassCmdDeleteTrace, iclsPtr); - - Tcl_DecrRefCount(cmdNamePtr); - /* FIXME should set the class objects unknown command to Itcl_HandleClass */ - - *rPtr = iclsPtr; - result = TCL_OK; -errorOut: - Tcl_DecrRefCount(nameObjPtr); - return result; -} - - -/* - * ------------------------------------------------------------------------ - * ItclDeleteClassVariablesNamespace() - * - * ------------------------------------------------------------------------ - */ -void -ItclDeleteClassVariablesNamespace( - Tcl_Interp *interp, - ItclClass *iclsPtr) -{ - /* TODO: why is this being skipped? */ - return; -} - -static int -CallDeleteOneObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_HashEntry *hPtr; - Tcl_HashSearch place; - ItclClass *iclsPtr2 = NULL; - ItclObject *contextIoPtr; - ItclClass *iclsPtr = data[0]; - ItclObjectInfo *infoPtr = data[1]; - void *callbackPtr; - int classIsDeleted; - - if (result != TCL_OK) { - return result; - } - classIsDeleted = 0; - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr); - if (hPtr == NULL) { - classIsDeleted = 1; - } - if (classIsDeleted) { - return result; - } - /* - * Fix 227804: Whenever an object to delete was found we - * have to reset the search to the beginning as the - * current entry in the search was deleted and accessing it - * is therefore not allowed anymore. - */ - - hPtr = Tcl_FirstHashEntry(&infoPtr->objects, &place); - if (hPtr) { - contextIoPtr = (ItclObject*)Tcl_GetHashValue(hPtr); - - while (contextIoPtr->iclsPtr != iclsPtr) { - hPtr = Tcl_NextHashEntry(&place); - if (hPtr == NULL) { - break; - } - } - if (hPtr) { - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - if (Itcl_DeleteObject(interp, contextIoPtr) != TCL_OK) { - iclsPtr2 = iclsPtr; - goto deleteClassFail; - } - - Tcl_NRAddCallback(interp, CallDeleteOneObject, iclsPtr, - infoPtr, NULL, NULL); - return Itcl_NRRunCallbacks(interp, callbackPtr); - } - - } - - return TCL_OK; - -deleteClassFail: - /* check if class is not yet deleted */ - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr2); - if (hPtr != NULL) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while deleting class \"%s\")", - iclsPtr2->nsPtr->fullName)); - } - return TCL_ERROR; -} - -static int -CallDeleteOneClass( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_HashEntry *hPtr; - ItclClass *iclsPtr = data[0]; - ItclObjectInfo *infoPtr = data[1]; - int isDerivedReleased; - - if (result != TCL_OK) { - return result; - } - isDerivedReleased = iclsPtr->flags & ITCL_CLASS_DERIVED_RELEASED; - result = Itcl_DeleteClass(interp, iclsPtr); - if (!isDerivedReleased) { - if (result == TCL_OK) { - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr); - if (hPtr != NULL) { - /* release from derived reference */ - ItclReleaseClass(iclsPtr); - } - } - } - if (result == TCL_OK) { - return TCL_OK; - } - - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while deleting class \"%s\")", - iclsPtr->nsPtr->fullName)); - return TCL_ERROR; -} -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteClass() - * - * Deletes a class by deleting all derived classes and all objects in - * that class, and finally, by destroying the class namespace. This - * procedure provides a friendly way of doing this. If any errors - * are detected along the way, the process is aborted. - * - * Returns TCL_OK if successful, or TCL_ERROR (along with an error - * message in the interpreter) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_DeleteClass( - Tcl_Interp *interp, /* interpreter managing this class */ - ItclClass *iclsPtr) /* class */ -{ - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr2 = NULL; - Itcl_ListElem *elem; - void *callbackPtr; - int result; - - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr); - if (hPtr == NULL) { - /* class has already been deleted */ - return TCL_OK; - } - if (iclsPtr->flags & ITCL_CLASS_IS_DELETED) { - return TCL_OK; - } - iclsPtr->flags |= ITCL_CLASS_IS_DELETED; - /* - * Destroy all derived classes, since these lose their meaning - * when the base class goes away. If anything goes wrong, - * abort with an error. - * - * TRICKY NOTE: When a derived class is destroyed, it - * automatically deletes itself from the "derived" list. - */ - elem = Itcl_FirstListElem(&iclsPtr->derived); - while (elem) { - iclsPtr2 = (ItclClass*)Itcl_GetListValue(elem); - elem = Itcl_NextListElem(elem); /* advance here--elem will go away */ - - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, CallDeleteOneClass, iclsPtr2, - iclsPtr2->infoPtr, NULL, NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (result != TCL_OK) { - return result; - } - } - - /* - * Scan through and find all objects that belong to this class. - * Note that more specialized objects have already been - * destroyed above, when derived classes were destroyed. - * Destroy objects and report any errors. - */ - /* - * we have to enroll the while loop to fit for NRE - * so we add a callback to delete the first element - * and run this callback. At the end of the execution of that callback - * we add eventually a callback for the next element and run that etc ... - * if an error occurs we terminate the enrolled loop and return - * otherwise we return at the end of the enrolled loop. - */ - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, CallDeleteOneObject, iclsPtr, - iclsPtr->infoPtr, NULL, NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (result != TCL_OK) { - return result; - } - /* - * Destroy the namespace associated with this class. - * - * TRICKY NOTE: - * The cleanup procedure associated with the namespace is - * invoked automatically. It does all of the same things - * above, but it also disconnects this class from its - * base-class lists, and removes the class access command. - */ - ItclDeleteClassVariablesNamespace(interp, iclsPtr); - Tcl_DeleteNamespace(iclsPtr->nsPtr); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * ItclDestroyClass() - * - * Invoked whenever the access command for a class is destroyed. - * Destroys the namespace associated with the class, which also - * destroys all objects in the class and all derived classes. - * Disconnects this class from the "derived" class lists of its - * base classes, and releases any claim to the class definition - * data. If this is the last use of that data, the class will - * completely vanish at this point. - * ------------------------------------------------------------------------ - */ -static void -ItclDestroyClass( - ClientData cdata) /* class definition to be destroyed */ -{ - ItclClass *iclsPtr = (ItclClass*)cdata; - - if (iclsPtr->flags & ITCL_CLASS_IS_DESTROYED) { - return; - } - iclsPtr->flags |= ITCL_CLASS_IS_DESTROYED; - if (!(iclsPtr->flags & ITCL_CLASS_NS_IS_DESTROYED)) { - if (iclsPtr->accessCmd) { - Tcl_DeleteCommandFromToken(iclsPtr->interp, iclsPtr->accessCmd); - iclsPtr->accessCmd = NULL; - } - Tcl_DeleteNamespace(iclsPtr->nsPtr); - } - ItclReleaseClass(iclsPtr); -} - - -/* - * ------------------------------------------------------------------------ - * ItclDestroyClassNamesp() - * - * Invoked whenever the namespace associated with a class is destroyed. - * Destroys all objects associated with this class and all derived - * classes. Disconnects this class from the "derived" class lists - * of its base classes, and removes the class access command. Releases - * any claim to the class definition data. If this is the last use - * of that data, the class will completely vanish at this point. - * ------------------------------------------------------------------------ - */ -void -ItclDestroyClassNamesp( - ClientData cdata) /* class definition to be destroyed */ -{ - Tcl_HashEntry *hPtr; - Tcl_HashSearch place; - Tcl_Command cmdPtr; - ItclClass *iclsPtr; - ItclObject *ioPtr; - Itcl_ListElem *elem; - Itcl_ListElem *belem; - ItclClass *iclsPtr2; - ItclClass *basePtr; - ItclClass *derivedPtr; - - - iclsPtr = (ItclClass*)cdata; - if (iclsPtr->flags & ITCL_CLASS_NS_IS_DESTROYED) { - return; - } - iclsPtr->flags |= ITCL_CLASS_NS_IS_DESTROYED; - /* - * Destroy all derived classes, since these lose their meaning - * when the base class goes away. - * - * TRICKY NOTE: When a derived class is destroyed, it - * automatically deletes itself from the "derived" list. - */ - elem = Itcl_FirstListElem(&iclsPtr->derived); - while (elem) { - iclsPtr2 = (ItclClass*)Itcl_GetListValue(elem); - if (iclsPtr2->nsPtr != NULL) { - Tcl_DeleteNamespace(iclsPtr2->nsPtr); - } - - /* As the first namespace is now destroyed we have to get the - * new first element of the hash table. We cannot go to the - * next element from the current one, because the current one - * is deleted. itcl Patch #593112, for Bug #577719. - */ - - elem = Itcl_FirstListElem(&iclsPtr->derived); - } - - /* - * Scan through and find all objects that belong to this class. - * Destroy them quietly by deleting their access command. - */ - hPtr = Tcl_FirstHashEntry(&iclsPtr->infoPtr->objects, &place); - while (hPtr) { - ioPtr = (ItclObject*)Tcl_GetHashValue(hPtr); - if (ioPtr->iclsPtr == iclsPtr) { - if ((ioPtr->accessCmd != NULL) && (!(ioPtr->flags & - (ITCL_OBJECT_IS_DESTRUCTED)))) { - ItclPreserveObject(ioPtr); - Tcl_DeleteCommandFromToken(iclsPtr->interp, ioPtr->accessCmd); - ioPtr->accessCmd = NULL; - ItclReleaseObject(ioPtr); - /* - * Fix 227804: Whenever an object to delete was found we - * have to reset the search to the beginning as the - * current entry in the search was deleted and accessing it - * is therefore not allowed anymore. - */ - - hPtr = Tcl_FirstHashEntry(&iclsPtr->infoPtr->objects, &place); - continue; - } - } - hPtr = Tcl_NextHashEntry(&place); - } - - /* - * Next, remove this class from the "derived" list in - * all base classes. - */ - belem = Itcl_FirstListElem(&iclsPtr->bases); - while (belem) { - basePtr = (ItclClass*)Itcl_GetListValue(belem); - - elem = Itcl_FirstListElem(&basePtr->derived); - while (elem) { - derivedPtr = (ItclClass*)Itcl_GetListValue(elem); - if (derivedPtr == iclsPtr) { - derivedPtr->flags |= ITCL_CLASS_DERIVED_RELEASED; - ItclReleaseClass(derivedPtr); - elem = Itcl_DeleteListElem(elem); - } else { - elem = Itcl_NextListElem(elem); - } - } - belem = Itcl_NextListElem(belem); - } - - /* - * Next, destroy the access command associated with the class. - */ - iclsPtr->flags |= ITCL_CLASS_NS_TEARDOWN; - if (iclsPtr->accessCmd) { - cmdPtr = iclsPtr->accessCmd; - iclsPtr->accessCmd = NULL; - Tcl_DeleteCommandFromToken(iclsPtr->interp, cmdPtr); - } - - /* - * Release the namespace's claim on the class definition. - */ - ItclReleaseClass(iclsPtr); -} - - -/* - * ------------------------------------------------------------------------ - * ItclFreeClass() - * - * Frees all memory associated with a class definition. This is - * usually invoked automatically by Itcl_ReleaseData(), when class - * data is no longer being used. - * ------------------------------------------------------------------------ - */ -static void -ItclFreeClass( - char *cdata) /* class definition to be destroyed */ -{ - FOREACH_HASH_DECLS; - Tcl_HashSearch place; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclVariable *ivPtr; - ItclOption *ioptPtr; - ItclComponent *icPtr; - ItclDelegatedOption *idoPtr; - ItclDelegatedFunction *idmPtr; - Itcl_ListElem *elem; - ItclVarLookup *vlookup; - ItclCmdLookup *clookupPtr; - Tcl_Var var; - - iclsPtr = (ItclClass*)cdata; - if (iclsPtr->flags & ITCL_CLASS_IS_FREED) { - return; - } - ItclDeleteClassesDictInfo(iclsPtr->interp, iclsPtr); - iclsPtr->flags |= ITCL_CLASS_IS_FREED; - - /* - * Tear down the list of derived classes. This list should - * really be empty if everything is working properly, but - * release it here just in case. - */ - elem = Itcl_FirstListElem(&iclsPtr->derived); - while (elem) { - ItclReleaseClass( Itcl_GetListValue(elem) ); - elem = Itcl_NextListElem(elem); - } - Itcl_DeleteList(&iclsPtr->derived); - - /* - * Tear down the variable resolution table. Some records - * appear multiple times in the table (for x, foo::x, etc.) - * so each one has a reference count. - */ -/* Tcl_InitHashTable(&varTable, TCL_STRING_KEYS); */ - - FOREACH_HASH_VALUE(vlookup, &iclsPtr->resolveVars) { - if (--vlookup->usage == 0) { - /* - * If this is a common variable owned by this class, - * then release the class's hold on it. FIXME !!! - */ - ckfree((char*)vlookup); - } - } - - Tcl_DeleteHashTable(&iclsPtr->resolveVars); - - /* - * Tear down the virtual method table... - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->resolveCmds, &place); - if (hPtr == NULL) { - break; - } - clookupPtr = Tcl_GetHashValue(hPtr); - ckfree((char *)clookupPtr); - Tcl_DeleteHashEntry(hPtr); - } - Tcl_DeleteHashTable(&iclsPtr->resolveCmds); - - /* - * Delete all option definitions. - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->options, &place); - if (hPtr == NULL) { - break; - } - ioptPtr = Tcl_GetHashValue(hPtr); - Tcl_DeleteHashEntry(hPtr); - Itcl_ReleaseData(ioptPtr); - } - Tcl_DeleteHashTable(&iclsPtr->options); - - /* - * Delete all function definitions. - */ - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - imPtr->iclsPtr = NULL; - ItclReleaseIMF(imPtr); - } - Tcl_DeleteHashTable(&iclsPtr->functions); - - /* - * Delete all delegated options. - */ - FOREACH_HASH_VALUE(idoPtr, &iclsPtr->delegatedOptions) { - Itcl_ReleaseData(idoPtr); - } - Tcl_DeleteHashTable(&iclsPtr->delegatedOptions); - - /* - * Delete all delegated functions. - */ - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (idmPtr->icPtr != NULL) { - if (idmPtr->icPtr->ivPtr->iclsPtr == iclsPtr) { - ItclDeleteDelegatedFunction(idmPtr); - } - } - } - Tcl_DeleteHashTable(&iclsPtr->delegatedFunctions); - - /* - * Delete all components - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->components, &place); - if (hPtr == NULL) { - break; - } - icPtr = Tcl_GetHashValue(hPtr); - Tcl_DeleteHashEntry(hPtr); - if (icPtr != NULL) { - ItclDeleteComponent(icPtr); - } - } - Tcl_DeleteHashTable(&iclsPtr->components); - - /* - * Delete all variable definitions. - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->variables, &place); - if (hPtr == NULL) { - break; - } - ivPtr = Tcl_GetHashValue(hPtr); - Tcl_DeleteHashEntry(hPtr); - if (ivPtr != NULL) { - Itcl_ReleaseData(ivPtr); - } - } - Tcl_DeleteHashTable(&iclsPtr->variables); - - /* - * Release the claim on all base classes. - */ - elem = Itcl_FirstListElem(&iclsPtr->bases); - while (elem) { - ItclReleaseClass( Itcl_GetListValue(elem) ); - elem = Itcl_NextListElem(elem); - } - Itcl_DeleteList(&iclsPtr->bases); - Tcl_DeleteHashTable(&iclsPtr->heritage); - - /* remove owerself from the all classes entry */ - hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->nameClasses, - (char *)iclsPtr->fullNamePtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - - /* remove owerself from the all namespaceClasses entry */ - hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->namespaceClasses, - (char *)iclsPtr->nsPtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - - /* remove owerself from the all classes entry */ - hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->classes, (char *)iclsPtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - - /* FIXME !!! - free contextCache - free resolvePtr -- this is only needed for CallFrame Resolvers - -- not used at the moment - */ - - FOREACH_HASH_VALUE(var, &iclsPtr->classCommons) { - Itcl_ReleaseVar(var); - } - Tcl_DeleteHashTable(&iclsPtr->classCommons); - - /* - * Free up the widget class name - */ - if (iclsPtr->widgetClassPtr != NULL) { - Tcl_DecrRefCount(iclsPtr->widgetClassPtr); - } - - /* - * Free up the widget hulltype name - */ - if (iclsPtr->hullTypePtr != NULL) { - Tcl_DecrRefCount(iclsPtr->hullTypePtr); - } - - /* - * Free up the type typeconstrutor code - */ - - if (iclsPtr->typeConstructorPtr != NULL) { - Tcl_DecrRefCount(iclsPtr->typeConstructorPtr); - } - - /* - * Free up the object initialization code. - */ - if (iclsPtr->initCode) { - Tcl_DecrRefCount(iclsPtr->initCode); - } - - Itcl_ReleaseData((ClientData)iclsPtr->infoPtr); - - Tcl_DecrRefCount(iclsPtr->namePtr); - Tcl_DecrRefCount(iclsPtr->fullNamePtr); - - if (iclsPtr->resolvePtr != NULL) { - ckfree((char *)iclsPtr->resolvePtr->clientData); - ckfree((char *)iclsPtr->resolvePtr); - } - ckfree((char*)iclsPtr); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsClassNamespace() - * - * Checks to see whether or not the given namespace represents an - * [incr Tcl] class. Returns non-zero if so, and zero otherwise. - * ------------------------------------------------------------------------ - */ -int -Itcl_IsClassNamespace( - Tcl_Namespace *nsPtr) /* namespace being tested */ -{ - ItclClass *iclsPtr = ItclNamespace2Class(nsPtr); - return iclsPtr != NULL; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsClass() - * - * Checks the given Tcl command to see if it represents an itcl class. - * Returns non-zero if the command is associated with a class. - * ------------------------------------------------------------------------ - */ -int -Itcl_IsClass( - Tcl_Command cmd) /* command being tested */ -{ - Tcl_CmdInfo cmdInfo; - - if (Tcl_GetCommandInfoFromToken(cmd, &cmdInfo) == 0) { - return 0; - } - if (cmdInfo.deleteProc == ItclDestroyClass) { - return 1; - } - - /* - * This may be an imported command. Try to get the real - * command and see if it represents a class. - */ - cmd = Tcl_GetOriginalCommand(cmd); - if (cmd != NULL) { - if (Tcl_GetCommandInfoFromToken(cmd, &cmdInfo) == 0) { - return 0; - } - if (cmdInfo.deleteProc == ItclDestroyClass) { - return 1; - } - } - return 0; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_FindClass() - * - * Searches for the specified class in the active namespace. If the - * class is found, this procedure returns a pointer to the class - * definition. Otherwise, if the autoload flag is non-zero, an - * attempt will be made to autoload the class definition. If it - * still can't be found, this procedure returns NULL, along with an - * error message in the interpreter. - * ------------------------------------------------------------------------ - */ -ItclClass* -Itcl_FindClass( - Tcl_Interp* interp, /* interpreter containing class */ - const char* path, /* path name for class */ - int autoload) -{ - /* - * Search for a namespace with the specified name, and if - * one is found, see if it is a class namespace. - */ - - Tcl_Namespace* classNs = Itcl_FindClassNamespace(interp, path); - - if (classNs) { - ItclObjectInfo *infoPtr - = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, - (char *) classNs); - if (hPtr) { - return (ItclClass *) Tcl_GetHashValue(hPtr); - } - } - - /* - * If the autoload flag is set, try to autoload the class - * definition, then search again. - */ - if (autoload) { - Tcl_DString buf; - - Tcl_DStringInit(&buf); - Tcl_DStringAppend(&buf, "::auto_load ", -1); - Tcl_DStringAppend(&buf, path, -1); - if (Tcl_EvalEx(interp, Tcl_DStringValue(&buf), -1, 0) != TCL_OK) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while attempting to autoload class \"%s\")", - path)); - Tcl_DStringFree(&buf); - return NULL; - } - Tcl_ResetResult(interp); - Tcl_DStringFree(&buf); - - return Itcl_FindClass(interp, path, 0); - } - - Tcl_AppendResult(interp, "class \"", path, "\" not found in context \"", - Tcl_GetCurrentNamespace(interp)->fullName, "\"", - (char*)NULL); - - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_FindClassNamespace() - * - * Searches for the specified class namespace. The normal Tcl procedure - * Tcl_FindNamespace also searches for namespaces, but only in the - * current namespace context. This makes it hard to find one class - * from within another. For example, suppose. you have two namespaces - * Foo and Bar. If you're in the context of Foo and you look for - * Bar, you won't find it with Tcl_FindNamespace. This behavior is - * okay for namespaces, but wrong for classes. - * - * This procedure search for a class namespace. If the name is - * absolute (i.e., starts with "::"), then that one name is checked, - * and the class is either found or not. But if the name is relative, - * it is sought in the current namespace context and in the global - * context, just like the normal command lookup. - * - * This procedure returns a pointer to the desired namespace, or - * NULL if the namespace was not found. - * ------------------------------------------------------------------------ - */ -Tcl_Namespace* -Itcl_FindClassNamespace(interp, path) - Tcl_Interp* interp; /* interpreter containing class */ - const char* path; /* path name for class */ -{ - Tcl_Namespace* contextNs = Tcl_GetCurrentNamespace(interp); - Tcl_Namespace *classNs = Tcl_FindNamespace(interp, path, NULL, 0); - - if ( !classNs /* We didn't find it... */ - && contextNs->parentPtr != NULL /* context is not global */ - && (*path != ':' || *(path+1) != ':') /* path not FQ */ - ) { - - if (strcmp(contextNs->name, path) == 0) { - classNs = contextNs; - } else { - classNs = Tcl_FindNamespace(interp, path, NULL, TCL_GLOBAL_ONLY); - } - } - return classNs; -} - - -static int -FinalizeCreateObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Obj *objNamePtr = data[0]; - ItclClass *iclsPtr = data[1]; - if (result == TCL_OK) { - if (!(iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, Tcl_GetString(objNamePtr), NULL); - } - } - Tcl_DecrRefCount(objNamePtr); - return result; -} - -static int -CallCreateObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Obj *objNamePtr = data[0]; - ItclClass *iclsPtr = data[1]; - int objc = PTR2INT(data[2]); - Tcl_Obj **objv = data[3]; - - if (result == TCL_OK) { - result = ItclCreateObject(interp, Tcl_GetString(objNamePtr), iclsPtr, - objc, objv); - } - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_HandleClass() - * - * first argument is ::itcl::parser::handleClass - * Invoked by Tcl whenever the user issues the command associated with - * a class name. Handles the following syntax: - * - * <className> - * <className> <objName> ?<args>...? - * - * Without any arguments, the command does nothing. In the olden days, - * this allowed the class name to be invoked by itself to prompt the - * autoloader to load the class definition. Today, this behavior is - * retained for backward compatibility with old releases. - * - * If arguments are specified, then this procedure creates a new - * object named <objName> in the appropriate class. Note that if - * <objName> contains "#auto", that part is automatically replaced - * by a unique string built from the class name. - * ------------------------------------------------------------------------ - */ -int -Itcl_HandleClass( - ClientData clientData, /* class definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - if (objc > 3) { - const char *token = Tcl_GetString(objv[3]); - const char *nsEnd = NULL; - const char *pos = token; - const char *tail = pos; - int fq = 0; - int code = TCL_OK; - Tcl_Obj *nsObj, *fqObj; - - while ((pos = strstr(pos, "::"))) { - if (pos == token) { - fq = 1; - nsEnd = token; - } else if (pos[-1] != ':') { - nsEnd = pos - 1; - } - tail = pos + 2; pos++; - } - - if (fq) { - nsObj = Tcl_NewStringObj(token, nsEnd-token); - } else { - Tcl_Namespace *nsPtr = Tcl_GetCurrentNamespace(interp); - - nsObj = Tcl_NewStringObj(nsPtr->fullName, -1); - if (nsEnd) { - Tcl_AppendToObj(nsObj, "::", 2); - Tcl_AppendToObj(nsObj, token, nsEnd-token); - } - } - - fqObj = Tcl_DuplicateObj(nsObj); - Tcl_AppendToObj(fqObj, "::", 2); - Tcl_AppendToObj(fqObj, tail, -1); - - if (Tcl_GetCommandFromObj(interp, fqObj)) { - Tcl_AppendResult(interp, "command \"", tail, - "\" already exists in namespace \"", Tcl_GetString(nsObj), - "\"", NULL); - code = TCL_ERROR; - } - Tcl_DecrRefCount(fqObj); - Tcl_DecrRefCount(nsObj); - if (code != TCL_OK) { - return code; - } - } - return ItclClassCreateObject(clientData, interp, objc, objv); -} - -int -ItclClassCreateObject( - ClientData clientData, /* IclObjectInfo */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_DString buffer; /* buffer used to build object names */ - Tcl_Obj *objNamePtr; - Tcl_HashEntry *hPtr; - Tcl_Obj **newObjv; - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - void *callbackPtr; - char unique[256]; /* buffer used for unique part of object names */ - char *token; - char *objName; - char tmp; - char *start; - char *pos; - const char *match; - - infoPtr = (ItclObjectInfo *)clientData; - Tcl_ResetResult(interp); - ItclShowArgs(1, "ItclClassCreateObject", objc, objv); - /* - * If the command is invoked without an object name, then do nothing. - * This used to support autoloading--that the class name could be - * invoked as a command by itself, prompting the autoloader to - * load the class definition. We retain the behavior here for - * backward-compatibility with earlier releases. - */ - if (objc <= 3) { - return TCL_OK; - } - - hPtr = Tcl_FindHashEntry(&infoPtr->nameClasses, (char *)objv[2]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "no such class: \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - iclsPtr = Tcl_GetHashValue(hPtr); - - /* - * If the object name is "::", and if this is an old-style class - * definition, then treat the remaining arguments as a command - * in the class namespace. This used to be the way of invoking - * a class proc, but the new syntax is "class::proc" (without - * spaces). - */ - token = Tcl_GetString(objv[3]); - if ((*token == ':') && (strcmp(token,"::") == 0) && (objc > 4)) { - /* - * If this is not an old-style class, then return an error - * describing the syntax change. - */ - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "syntax \"class :: proc\" is an anachronism\n", - "[incr Tcl] no longer supports this syntax.\n", - "Instead, remove the spaces from your procedure invocations:\n", - " ", - Tcl_GetString(objv[1]), "::", - Tcl_GetString(objv[4]), " ?args?", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Otherwise, we have a proper object name. Create a new instance - * with that name. If the name contains "#auto", replace this with - * a uniquely generated string based on the class name. - */ - Tcl_DStringInit(&buffer); - objName = NULL; - - match = "#auto"; - start = token; - for (pos=start; *pos != '\0'; pos++) { - if (*pos == *match) { - if (*(++match) == '\0') { - tmp = *start; - *start = '\0'; /* null-terminate first part */ - - /* - * Substitute a unique part in for "#auto", and keep - * incrementing a counter until a valid name is found. - */ - do { - Tcl_CmdInfo dummy; - - sprintf(unique,"%.200s%d", Tcl_GetString(iclsPtr->namePtr), - iclsPtr->unique++); - unique[0] = tolower(UCHAR(unique[0])); - - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, token, -1); - Tcl_DStringAppend(&buffer, unique, -1); - Tcl_DStringAppend(&buffer, start+5, -1); - - objName = Tcl_DStringValue(&buffer); - - /* - * [Fix 227811] Check for any command with the - * given name, not only objects. - */ - - if (Tcl_GetCommandInfo (interp, objName, &dummy) == 0) { - break; /* if an error is found, bail out! */ - } - } while (1); - - *start = tmp; /* undo null-termination */ - objName = Tcl_DStringValue(&buffer); - break; /* object name is ready to go! */ - } - } - else { - match = "#auto"; - pos = start++; - } - } - - /* - * If "#auto" was not found, then just use object name as-is. - */ - if (objName == NULL) { - objName = token; - } - - /* - * Try to create a new object. If successful, return the - * object name as the result of this command. - */ - objNamePtr = Tcl_NewStringObj(objName, -1); - Tcl_IncrRefCount(objNamePtr); - Tcl_DStringFree(&buffer); - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - newObjv = (Tcl_Obj **)(objv+4); - Tcl_NRAddCallback(interp, FinalizeCreateObject, objNamePtr, iclsPtr, - NULL, NULL); - Tcl_NRAddCallback(interp, CallCreateObject, objNamePtr, iclsPtr, - INT2PTR(objc-4), newObjv); - return Itcl_NRRunCallbacks(interp, callbackPtr); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BuildVirtualTables() - * - * Invoked whenever the class heritage changes or members are added or - * removed from a class definition to rebuild the member lookup - * tables. There are two tables: - * - * METHODS: resolveCmds - * Used primarily in Itcl_ClassCmdResolver() to resolve all - * command references in a namespace. - * - * DATA MEMBERS: resolveVars - * Used primarily in Itcl_ClassVarResolver() to quickly resolve - * variable references in each class scope. - * - * These tables store every possible name for each command/variable - * (member, class::member, namesp::class::member, etc.). Members - * in a derived class may shadow members with the same name in a - * base class. In that case, the simple name in the resolution - * table will point to the most-specific member. - * ------------------------------------------------------------------------ - */ -void -Itcl_BuildVirtualTables( - ItclClass* iclsPtr) /* class definition being updated */ -{ - Tcl_HashEntry *hPtr; - Tcl_HashSearch place; - Tcl_Namespace* nsPtr; - Tcl_DString buffer, buffer2; - Tcl_Obj *objPtr; - ItclVarLookup *vlookup; - ItclVariable *ivPtr; - ItclMemberFunc *imPtr; - ItclDelegatedFunction *idmPtr; - ItclHierIter hier; - ItclClass *iclsPtr2; - ItclCmdLookup *clookupPtr; -#ifdef NEW_PROTO_RESOLVER - ItclClassVarInfo *icviPtr; - ItclClassCmdInfo *icciPtr; -#endif - int newEntry; - - Tcl_DStringInit(&buffer); - Tcl_DStringInit(&buffer2); - - /* - * Clear the variable resolution table. - */ - hPtr = Tcl_FirstHashEntry(&iclsPtr->resolveVars, &place); - while (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - if (--vlookup->usage == 0) { - ckfree((char*)vlookup); - } - hPtr = Tcl_NextHashEntry(&place); - } - Tcl_DeleteHashTable(&iclsPtr->resolveVars); - Tcl_InitHashTable(&iclsPtr->resolveVars, TCL_STRING_KEYS); - iclsPtr->numInstanceVars = 0; - - /* - * Set aside the first object-specific slot for the built-in - * "this" variable. Only allocate one of these, even though - * there is a definition for "this" in each class scope. - * Set aside the second and third object-specific slot for the built-in - * "itcl_options" and "itcl_option_components" variable. - */ - iclsPtr->numInstanceVars++; - iclsPtr->numInstanceVars++; - iclsPtr->numInstanceVars++; - - /* - * Scan through all classes in the hierarchy, from most to - * least specific. Add a lookup entry for each variable - * into the table. - */ - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr2->variables, &place); - while (hPtr) { -#ifdef NEW_PROTO_RESOLVER - int type = VAR_TYPE_VARIABLE; -#endif - ivPtr = (ItclVariable*)Tcl_GetHashValue(hPtr); - - vlookup = (ItclVarLookup *)ckalloc(sizeof(ItclVarLookup)); - vlookup->ivPtr = ivPtr; - vlookup->usage = 0; - vlookup->leastQualName = NULL; - - /* - * If this variable is PRIVATE to another class scope, - * then mark it as "inaccessible". - */ - vlookup->accessible = (ivPtr->protection != ITCL_PRIVATE || - ivPtr->iclsPtr == iclsPtr); - - if (ivPtr->flags & ITCL_COMMON) { -#ifdef NEW_PROTO_RESOLVER - type = VAR_TYPE_COMMON; -#endif - } - /* - * If this is a reference to the built-in "this" - * variable, then its index is "0". Otherwise, - * add another slot to the end of the table. - */ - if ((ivPtr->flags & ITCL_THIS_VAR) != 0) { - vlookup->varNum = 0; - } else { - if ((ivPtr->flags & ITCL_OPTIONS_VAR) != 0) { - vlookup->varNum = 1; - } else { - vlookup->varNum = iclsPtr->numInstanceVars++; - } - } -#ifdef NEW_PROTO_RESOLVER - icviPtr = (ItclClassVarInfo *)ckalloc( - sizeof(ItclClassVarInfo)); - icviPtr->type = type; - icviPtr->protection = ivPtr->protection; - icviPtr->nsPtr = iclsPtr->nsPtr; - icviPtr->declaringNsPtr = iclsPtr2->nsPtr; - icviPtr->varNum = vlookup->varNum; - ClientData clientData2; - clientData2 = Itcl_RegisterClassVariable( - iclsPtr->infoPtr->interp, iclsPtr2->nsPtr, - Tcl_GetString(ivPtr->namePtr), icviPtr); - vlookup->classVarInfoPtr = clientData2; -#endif -/* FIXME !!! should use for var lookup !! */ - - /* - * Create all possible names for this variable and enter - * them into the variable resolution table: - * var - * class::var - * namesp1::class::var - * namesp2::namesp1::class::var - * ... - */ - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, Tcl_GetString(ivPtr->namePtr), -1); - nsPtr = iclsPtr2->nsPtr; - - while (1) { - hPtr = Tcl_CreateHashEntry(&iclsPtr->resolveVars, - Tcl_DStringValue(&buffer), &newEntry); - - if (newEntry) { - Tcl_SetHashValue(hPtr, (ClientData)vlookup); - vlookup->usage++; - - if (!vlookup->leastQualName) { - vlookup->leastQualName = - Tcl_GetHashKey(&iclsPtr->resolveVars, hPtr); - } -#ifdef NEW_PROTO_RESOLVER - Itcl_RegisterClassVariable(iclsPtr->infoPtr->interp, - iclsPtr->nsPtr, Tcl_DStringValue(&buffer), - vlookup->classVarInfoPtr); -#endif - } - - if (nsPtr == NULL) { - break; - } - Tcl_DStringSetLength(&buffer2, 0); - Tcl_DStringAppend(&buffer2, Tcl_DStringValue(&buffer), -1); - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, nsPtr->name, -1); - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, Tcl_DStringValue(&buffer2), -1); - - nsPtr = nsPtr->parentPtr; - } - - /* - * If this record is not needed, free it now. - */ - if (vlookup->usage == 0) { - ckfree((char*)vlookup); - } - hPtr = Tcl_NextHashEntry(&place); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - - /* - * Clear the command resolution table. - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->resolveCmds, &place); - if (hPtr == NULL) { - break; - } - clookupPtr = Tcl_GetHashValue(hPtr); - ckfree((char *)clookupPtr); - Tcl_DeleteHashEntry(hPtr); - } - Tcl_DeleteHashTable(&iclsPtr->resolveCmds); - Tcl_InitObjHashTable(&iclsPtr->resolveCmds); - - /* - * Scan through all classes in the hierarchy, from most to - * least specific. Look for the first (most-specific) definition - * of each member function, and enter it into the table. - */ - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr2->functions, &place); - while (hPtr) { - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(hPtr); - - /* - * Create all possible names for this function and enter - * them into the command resolution table: - * func - * class::func - * namesp1::class::func - * namesp2::namesp1::class::func - * ... - */ - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, Tcl_GetString(imPtr->namePtr), -1); - nsPtr = iclsPtr2->nsPtr; - - while (1) { - objPtr = Tcl_NewStringObj(Tcl_DStringValue(&buffer), -1); - hPtr = Tcl_CreateHashEntry(&iclsPtr->resolveCmds, - (char *)objPtr, &newEntry); - - if (newEntry) { - clookupPtr = (ItclCmdLookup *)ckalloc(sizeof(ItclCmdLookup)); - memset(clookupPtr, 0, sizeof(ItclCmdLookup)); - clookupPtr->imPtr = imPtr; - Tcl_SetHashValue(hPtr, (ClientData)clookupPtr); -#ifdef NEW_PROTO_RESOLVER - int type = CMD_TYPE_METHOD; - if (imPtr->flags & ITCL_COMMON) { - type = CMD_TYPE_PROC; - } - icciPtr = (ItclClassCmdInfo *)ckalloc( - sizeof(ItclClassCmdInfo)); - icciPtr->type = type; - icciPtr->protection = imPtr->protection; - icciPtr->nsPtr = iclsPtr->nsPtr; - icciPtr->declaringNsPtr = iclsPtr2->nsPtr; - ClientData clientData2; - clientData2 = Itcl_RegisterClassCommand( - iclsPtr->infoPtr->interp, iclsPtr->nsPtr, - Tcl_GetString(imPtr->namePtr), icciPtr); - clookupPtr->classCmdInfoPtr = clientData2; - clookupPtr->cmdPtr = imPtr->accessCmd; -#endif - } else { - Tcl_DecrRefCount(objPtr); - } - - if (nsPtr == NULL) { - break; - } - Tcl_DStringSetLength(&buffer2, 0); - Tcl_DStringAppend(&buffer2, Tcl_DStringValue(&buffer), -1); - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, nsPtr->name, -1); - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, Tcl_DStringValue(&buffer2), -1); - - nsPtr = nsPtr->parentPtr; - } - hPtr = Tcl_NextHashEntry(&place); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - - /* - * Scan through all classes in the hierarchy, from most to - * least specific. Look for the first (most-specific) definition - * of each delegated member function, and enter it into the table. - */ - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr2->delegatedFunctions, &place); - while (hPtr) { - idmPtr = (ItclDelegatedFunction *)Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)idmPtr->namePtr); - if (hPtr == NULL) { - hPtr = Tcl_CreateHashEntry(&iclsPtr->delegatedFunctions, - (char *)idmPtr->namePtr, &newEntry); - Tcl_SetHashValue(hPtr, idmPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - - Tcl_DStringFree(&buffer); - Tcl_DStringFree(&buffer2); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateVariable() - * - * Creates a new class variable definition. If this is a public - * variable, it may have a bit of "config" code that is used to - * update the object whenever the variable is modified via the - * built-in "configure" method. - * - * Returns TCL_ERROR along with an error message in the specified - * interpreter if anything goes wrong. Otherwise, this returns - * TCL_OK and a pointer to the new variable definition in "ivPtr". - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateVariable( - Tcl_Interp *interp, /* interpreter managing this transaction */ - ItclClass* iclsPtr, /* class containing this variable */ - Tcl_Obj* namePtr, /* variable name */ - char* init, /* initial value */ - char* config, /* code invoked when variable is configured */ - ItclVariable** ivPtrPtr) /* returns: new variable definition */ -{ - int newEntry; - ItclVariable *ivPtr; - ItclMemberCode *mCodePtr; - Tcl_HashEntry *hPtr; - - /* - * Add this variable to the variable table for the class. - * Make sure that the variable name does not already exist. - */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->variables, (char *)namePtr, &newEntry); - if (!newEntry) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "variable name \"", Tcl_GetString(namePtr), - "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this variable has some "config" code, try to capture - * its implementation. - */ - if (config) { - if (Itcl_CreateMemberCode(interp, iclsPtr, (char*)NULL, config, - &mCodePtr) != TCL_OK) { - Tcl_DeleteHashEntry(hPtr); - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)mCodePtr); - Itcl_EventuallyFree((ClientData)mCodePtr, Itcl_DeleteMemberCode); - } else { - mCodePtr = NULL; - } - - - /* - * If everything looks good, create the variable definition. - */ - ivPtr = (ItclVariable*)ckalloc(sizeof(ItclVariable)); - memset(ivPtr, 0, sizeof(ItclVariable)); - ivPtr->iclsPtr = iclsPtr; - ivPtr->infoPtr = iclsPtr->infoPtr; - ivPtr->protection = Itcl_Protection(interp, 0); - ivPtr->codePtr = mCodePtr; - ivPtr->namePtr = namePtr; - Tcl_IncrRefCount(ivPtr->namePtr); - ivPtr->fullNamePtr = Tcl_NewStringObj( - Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_AppendToObj(ivPtr->fullNamePtr, "::", 2); - Tcl_AppendToObj(ivPtr->fullNamePtr, Tcl_GetString(namePtr), -1); - Tcl_IncrRefCount(ivPtr->fullNamePtr); - - if (ivPtr->protection == ITCL_DEFAULT_PROTECT) { - ivPtr->protection = ITCL_PROTECTED; - } - - if (init != NULL) { - ivPtr->init = Tcl_NewStringObj(init, -1); - Tcl_IncrRefCount(ivPtr->init); - } else { - ivPtr->init = NULL; - } - - Tcl_SetHashValue(hPtr, (ClientData)ivPtr); - Itcl_PreserveData((ClientData)ivPtr); - Itcl_EventuallyFree((ClientData)ivPtr, Itcl_DeleteVariable); - - *ivPtrPtr = ivPtr; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateOption() - * - * Creates a new class option definition. If this is a public - * option, it may have a bit of "config" code that is used to - * update the object whenever the option is modified via the - * built-in "configure" method. - * - * Returns TCL_ERROR along with an error message in the specified - * interpreter if anything goes wrong. Otherwise, this returns - * TCL_OK and a pointer to the new option definition in "ioptPtr". - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateOption( - Tcl_Interp *interp, /* interpreter managing this transaction */ - ItclClass* iclsPtr, /* class containing this variable */ - ItclOption* ioptPtr) /* new option definition */ -{ - int newEntry; - ItclMemberCode *mCodePtr; - Tcl_HashEntry *hPtr; - - mCodePtr = NULL; - /* - * Add this option to the options table for the class. - * Make sure that the option name does not already exist. - */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->options, - (char *)ioptPtr->namePtr, &newEntry); - if (!newEntry) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "option name \"", Tcl_GetString(ioptPtr->namePtr), - "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - iclsPtr->numOptions++; - ioptPtr->iclsPtr = iclsPtr; - ioptPtr->codePtr = mCodePtr; - ioptPtr->fullNamePtr = Tcl_NewStringObj( - Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_AppendToObj(ioptPtr->fullNamePtr, "::", 2); - Tcl_AppendToObj(ioptPtr->fullNamePtr, Tcl_GetString(ioptPtr->namePtr), -1); - Tcl_IncrRefCount(ioptPtr->fullNamePtr); - Tcl_SetHashValue(hPtr, (ClientData)ioptPtr); - Itcl_PreserveData((ClientData)ioptPtr); - Itcl_EventuallyFree((ClientData)ioptPtr, ItclDeleteOption); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateMethodVariable() - * - * Creates a new class methdovariable definition. If this is a public - * methodvariable, - * - * Returns TCL_ERROR along with an error message in the specified - * interpreter if anything goes wrong. Otherwise, this returns - * TCL_OK and a pointer to the new option definition in "imvPtr". - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateMethodVariable( - Tcl_Interp *interp, /* interpreter managing this transaction */ - ItclClass* iclsPtr, /* class containing this variable */ - Tcl_Obj* namePtr, /* variable name */ - Tcl_Obj* defaultPtr, /* initial value */ - Tcl_Obj* callbackPtr, /* code invoked when variable is set */ - ItclMethodVariable** imvPtrPtr) - /* returns: new methdovariable definition */ -{ - int isNew; - ItclMethodVariable *imvPtr; - Tcl_HashEntry *hPtr; - - /* - * Add this methodvariable to the options table for the class. - * Make sure that the methodvariable name does not already exist. - */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->methodVariables, - (char *)namePtr, &isNew); - if (!isNew) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "methdovariable name \"", Tcl_GetString(namePtr), - "\" already defined in class \"", - Tcl_GetString (iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - Tcl_IncrRefCount(namePtr); - - /* - * If everything looks good, create the option definition. - */ - imvPtr = (ItclMethodVariable*)ckalloc(sizeof(ItclMethodVariable)); - memset(imvPtr, 0, sizeof(ItclMethodVariable)); - imvPtr->iclsPtr = iclsPtr; - imvPtr->protection = Itcl_Protection(interp, 0); - imvPtr->namePtr = namePtr; - Tcl_IncrRefCount(imvPtr->namePtr); - imvPtr->fullNamePtr = Tcl_NewStringObj( - Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_AppendToObj(imvPtr->fullNamePtr, "::", 2); - Tcl_AppendToObj(imvPtr->fullNamePtr, Tcl_GetString(namePtr), -1); - Tcl_IncrRefCount(imvPtr->fullNamePtr); - imvPtr->defaultValuePtr = defaultPtr; - if (defaultPtr != NULL) { - Tcl_IncrRefCount(imvPtr->defaultValuePtr); - } - imvPtr->callbackPtr = callbackPtr; - if (callbackPtr != NULL) { - Tcl_IncrRefCount(imvPtr->callbackPtr); - } - - if (imvPtr->protection == ITCL_DEFAULT_PROTECT) { - imvPtr->protection = ITCL_PROTECTED; - } - - Tcl_SetHashValue(hPtr, (ClientData)imvPtr); - - *imvPtrPtr = imvPtr; - return TCL_OK; -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_GetCommonVar() - * - * Returns the current value for a common class variable. The member - * name is interpreted with respect to the given class scope. That - * scope is installed as the current context before querying the - * variable. This by-passes the protection level in case the variable - * is "private". - * - * If successful, this procedure returns a pointer to a string value - * which remains alive until the variable changes it value. If - * anything goes wrong, this returns NULL. - * ------------------------------------------------------------------------ - */ -const char* -Itcl_GetCommonVar( - Tcl_Interp *interp, /* current interpreter */ - const char *name, /* name of desired instance variable */ - ItclClass *contextIclsPtr) /* name is interpreted in this scope */ -{ - const char *val = NULL; - Tcl_HashEntry *hPtr; - Tcl_DString buffer; - Tcl_Obj *namePtr; - ItclVariable *ivPtr; - const char *cp; - const char *lastCp; - Tcl_Object oPtr = NULL; - - lastCp = name; - cp = name; - while (cp != NULL) { - cp = strstr(lastCp, "::"); - if (cp != NULL) { - lastCp = cp + 2; - } - } - namePtr = Tcl_NewStringObj(lastCp, -1); - Tcl_IncrRefCount(namePtr); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->variables, (char *)namePtr); - Tcl_DecrRefCount(namePtr); - if (hPtr == NULL) { - return NULL; - } - ivPtr = Tcl_GetHashValue(hPtr); - /* - * Activate the namespace for the given class. That installs - * the appropriate name resolution rules and by-passes any - * security restrictions. - */ - - if (lastCp == name) { - /* 'name' is a simple name (this is untested!!!!) */ - - /* Use the context class passed in */ - oPtr = contextIclsPtr->oPtr; - - } else { - int code = TCL_ERROR; - Tcl_Obj *classObjPtr = Tcl_NewStringObj(name, lastCp - name - 2); - oPtr = Tcl_GetObjectFromObj(interp, classObjPtr); - - if (oPtr) { - ItclClass *iclsPtr = Tcl_ObjectGetMetadata(oPtr, - contextIclsPtr->infoPtr->class_meta_type); - if (iclsPtr) { - - code = TCL_OK; - assert(oPtr == iclsPtr->oPtr); - - /* - * If the caller gave us a qualified name into - * somewhere other than the context class, then - * things are really weird. Consider an assertion - * to prevent, but for now keep the functioning - * unchanged. - * - * assert(iclsPtr == contextIclsPtr); - */ - - } - - } - Tcl_DecrRefCount(classObjPtr); - if (code != TCL_OK) { - return NULL; - } - - } - - Tcl_DStringInit(&buffer); - if (ivPtr->protection != ITCL_PUBLIC) { - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - } - Tcl_DStringAppend(&buffer, (Tcl_GetObjectNamespace(oPtr))->fullName, -1); - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, lastCp, -1); - - val = Tcl_GetVar2(interp, (const char *)Tcl_DStringValue(&buffer), - (char*)NULL, 0); - Tcl_DStringFree(&buffer); - return val; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_InitHierIter() - * - * Initializes an iterator for traversing the hierarchy of the given - * class. Subsequent calls to Itcl_AdvanceHierIter() will return - * the base classes in order from most-to-least specific. - * ------------------------------------------------------------------------ - */ -void -Itcl_InitHierIter(iter,iclsPtr) - ItclHierIter *iter; /* iterator used for traversal */ - ItclClass *iclsPtr; /* class definition for start of traversal */ -{ - Itcl_InitStack(&iter->stack); - Itcl_PushStack((ClientData)iclsPtr, &iter->stack); - iter->current = iclsPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteHierIter() - * - * Destroys an iterator for traversing class hierarchies, freeing - * all memory associated with it. - * ------------------------------------------------------------------------ - */ -void -Itcl_DeleteHierIter(iter) - ItclHierIter *iter; /* iterator used for traversal */ -{ - Itcl_DeleteStack(&iter->stack); - iter->current = NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AdvanceHierIter() - * - * Moves a class hierarchy iterator forward to the next base class. - * Returns a pointer to the current class definition, or NULL when - * the end of the hierarchy has been reached. - * ------------------------------------------------------------------------ - */ -ItclClass* -Itcl_AdvanceHierIter( - ItclHierIter *iter) /* iterator used for traversal */ -{ - register Itcl_ListElem *elem; - ItclClass *iclsPtr; - - iter->current = (ItclClass*)Itcl_PopStack(&iter->stack); - - /* - * Push classes onto the stack in reverse order, so that - * they will be popped off in the proper order. - */ - if (iter->current) { - iclsPtr = (ItclClass*)iter->current; - elem = Itcl_LastListElem(&iclsPtr->bases); - while (elem) { - Itcl_PushStack(Itcl_GetListValue(elem), &iter->stack); - elem = Itcl_PrevListElem(elem); - } - } - return iter->current; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteVariable() - * - * Destroys a variable definition created by Itcl_CreateVariable(), - * freeing all resources associated with it. - * ------------------------------------------------------------------------ - */ -void -Itcl_DeleteVariable( - char *cdata) /* variable definition to be destroyed */ -{ - Tcl_HashEntry *hPtr; - ItclVariable *ivPtr; - - ivPtr = (ItclVariable *)cdata; -if (ivPtr->arrayInitPtr != NULL) { -} - hPtr = Tcl_FindHashEntry(&ivPtr->infoPtr->classes, (char *)ivPtr->iclsPtr); - if (hPtr != NULL) { - /* unlink owerself from list of class variables */ - hPtr = Tcl_FindHashEntry(&ivPtr->iclsPtr->variables, - (char *)ivPtr->namePtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - } - if (ivPtr->codePtr != NULL) { - Itcl_ReleaseData(ivPtr->codePtr); - } - Tcl_DecrRefCount(ivPtr->namePtr); - Tcl_DecrRefCount(ivPtr->fullNamePtr); - if (ivPtr->init) { - Tcl_DecrRefCount(ivPtr->init); - } - if (ivPtr->arrayInitPtr) { - Tcl_DecrRefCount(ivPtr->arrayInitPtr); - } - ckfree((char*)ivPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteOption() - * - * Destroys a option definition created by Itcl_CreateOption(), - * freeing all resources associated with it. - * ------------------------------------------------------------------------ - */ -static void -ItclDeleteOption( - char *cdata) /* option definition to be destroyed */ -{ - ItclOption *ioptPtr; - - ioptPtr = (ItclOption *)cdata; - Tcl_DecrRefCount(ioptPtr->namePtr); - Tcl_DecrRefCount(ioptPtr->fullNamePtr); - if (ioptPtr->resourceNamePtr != NULL) { - Tcl_DecrRefCount(ioptPtr->resourceNamePtr); - } - if (ioptPtr->resourceNamePtr != NULL) { - Tcl_DecrRefCount(ioptPtr->classNamePtr); - } - - Itcl_ReleaseData(ioptPtr->codePtr); - if (ioptPtr->defaultValuePtr != NULL) { - Tcl_DecrRefCount(ioptPtr->defaultValuePtr); - } - if (ioptPtr->cgetMethodPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->cgetMethodPtr); - } - if (ioptPtr->cgetMethodVarPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->cgetMethodVarPtr); - } - if (ioptPtr->configureMethodPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->configureMethodPtr); - } - if (ioptPtr->configureMethodVarPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->configureMethodVarPtr); - } - if (ioptPtr->validateMethodPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->validateMethodPtr); - } - if (ioptPtr->validateMethodVarPtr != NULL) { - Tcl_DecrRefCount(ioptPtr->validateMethodVarPtr); - } - Itcl_ReleaseData(ioptPtr->idoPtr); - ckfree((char*)ioptPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteFunction() - * - * fre data associated with a function - * ------------------------------------------------------------------------ - */ -static void -ItclDeleteFunction( - ItclMemberFunc *imPtr) -{ - Tcl_HashEntry *hPtr; - -if (imPtr->iclsPtr) { - hPtr = Tcl_FindHashEntry(&imPtr->iclsPtr->infoPtr->procMethods, - (char *) imPtr->tmPtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } -} - hPtr = Tcl_FindHashEntry(&imPtr->infoPtr->classes, (char *)imPtr->iclsPtr); - if (hPtr != NULL) { - /* unlink owerself from list of class functions */ - hPtr = Tcl_FindHashEntry(&imPtr->iclsPtr->functions, - (char *)imPtr->namePtr); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - } - if (imPtr->codePtr != NULL) { - Itcl_ReleaseData(imPtr->codePtr); - } - Tcl_DecrRefCount(imPtr->namePtr); - Tcl_DecrRefCount(imPtr->fullNamePtr); - if (imPtr->usagePtr != NULL) { - Tcl_DecrRefCount(imPtr->usagePtr); - } - if (imPtr->argumentPtr != NULL) { - Tcl_DecrRefCount(imPtr->argumentPtr); - } - if (imPtr->origArgsPtr != NULL) { - Tcl_DecrRefCount(imPtr->origArgsPtr); - } - if (imPtr->builtinArgumentPtr != NULL) { - Tcl_DecrRefCount(imPtr->builtinArgumentPtr); - } - if (imPtr->bodyPtr != NULL) { - Tcl_DecrRefCount(imPtr->bodyPtr); - } - if (imPtr->argListPtr != NULL) { - ItclDeleteArgList(imPtr->argListPtr); - } - ckfree((char*)imPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteComponent() - * - * free data associated with a component - * ------------------------------------------------------------------------ - */ -static void -ItclDeleteComponent( - ItclComponent *icPtr) -{ - Tcl_Obj *objPtr; - FOREACH_HASH_DECLS; - - Tcl_DecrRefCount(icPtr->namePtr); - /* the variable and the command are freed when freeing variables, - * functions */ - FOREACH_HASH_VALUE(objPtr, &icPtr->keptOptions) { - if (objPtr != NULL) { - Tcl_DecrRefCount(objPtr); - } - } - Tcl_DeleteHashTable(&icPtr->keptOptions); - ckfree((char*)icPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteDelegatedOption() - * - * free data associated with a delegated option - * ------------------------------------------------------------------------ - */ -void -ItclDeleteDelegatedOption( - char *cdata) -{ - Tcl_Obj *objPtr; - FOREACH_HASH_DECLS; - ItclDelegatedOption *idoPtr; - - idoPtr = (ItclDelegatedOption *)cdata; - Tcl_DecrRefCount(idoPtr->namePtr); - if (idoPtr->resourceNamePtr != NULL) { - Tcl_DecrRefCount(idoPtr->resourceNamePtr); - } - if (idoPtr->classNamePtr != NULL) { - Tcl_DecrRefCount(idoPtr->classNamePtr); - } - if (idoPtr->asPtr != NULL) { - Tcl_DecrRefCount(idoPtr->asPtr); - } - FOREACH_HASH_VALUE(objPtr, &idoPtr->exceptions) { - if (objPtr != NULL) { - Tcl_DecrRefCount(objPtr); - } - } - Tcl_DeleteHashTable(&idoPtr->exceptions); - ckfree((char *)idoPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteDelegatedFunction() - * - * free data associated with a delegated function - * ------------------------------------------------------------------------ - */ -void ItclDeleteDelegatedFunction( - ItclDelegatedFunction *idmPtr) -{ - Tcl_Obj *objPtr; - FOREACH_HASH_DECLS; - - Tcl_DecrRefCount(idmPtr->namePtr); - if (idmPtr->asPtr != NULL) { - Tcl_DecrRefCount(idmPtr->asPtr); - } - if (idmPtr->usingPtr != NULL) { - Tcl_DecrRefCount(idmPtr->usingPtr); - } - FOREACH_HASH_VALUE(objPtr, &idmPtr->exceptions) { - if (objPtr != NULL) { - Tcl_DecrRefCount(objPtr); - } - } - Tcl_DeleteHashTable(&idmPtr->exceptions); - ckfree((char *)idmPtr); -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclCmd.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclCmd.c deleted file mode 100644 index 1111953..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclCmd.c +++ /dev/null @@ -1,2182 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This file defines information that tracks classes and objects - * at a global level for a given interpreter. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "tclInt.h" -#include "itclInt.h" -/* - * ------------------------------------------------------------------------ - * Itcl_ThisCmd() - * - * Invoked by Tcl for fast access to itcl methods - * syntax: - * - * this methodName args .... - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -NRThisCmd( - ClientData clientData, /* class info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ClientData clientData2; - Tcl_Object oPtr; - ItclClass *iclsPtr; - - ItclShowArgs(1, "NRThisCmd", objc, objv); - iclsPtr = clientData; - clientData2 = Itcl_GetCallFrameClientData(interp); - oPtr = Tcl_ObjectContextObject(clientData2); - return Itcl_PublicObjectCmd(oPtr, interp, iclsPtr->clsPtr, objc, objv); -} -/* ARGSUSED */ -int -Itcl_ThisCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - FOREACH_HASH_DECLS; - ClientData clientData2; - Tcl_Object oPtr; - Tcl_Obj **newObjv; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - const char *funcName; - const char *val; - int result; - - if (objc == 1) { - return Itcl_SelfCmd(clientData,interp, objc, objv); - } - ItclShowArgs(1, "Itcl_ThisCmd", objc, objv); - iclsPtr = clientData; - clientData2 = Itcl_GetCallFrameClientData(interp); - if (clientData2 == NULL) { - Tcl_AppendResult(interp, - "this cannot be invoked without an object context", NULL); - return TCL_ERROR; - } - oPtr = Tcl_ObjectContextObject(clientData2); - if (oPtr == NULL) { - Tcl_AppendResult(interp, - "this cannot be invoked without an object context", NULL); - return TCL_ERROR; - } - if (objc == 1) { - Tcl_Obj *namePtr = Tcl_NewObj(); - - Tcl_GetCommandFullName(interp, Tcl_GetObjectCommand(oPtr), namePtr); - Tcl_SetObjResult(interp, namePtr); - return TCL_OK; - } - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objv[1]); - funcName = Tcl_GetString(objv[1]); - if (!(iclsPtr->flags & ITCL_CLASS)) { - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(Tcl_GetString(idmPtr->namePtr), funcName) == 0) { - if (idmPtr->icPtr == NULL) { - if (idmPtr->usingPtr != NULL) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * objc); - newObjv[0] = idmPtr->usingPtr; - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv+1, objv+2, sizeof(Tcl_Obj *) * - (objc - 2)); -ItclShowArgs(1, "EVAL2", objc - 1, newObjv); - result = Tcl_EvalObjv(interp, objc - 1, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - } else { - Tcl_AppendResult(interp, - "delegate has not yet been implemented in", - ": \"this\" method/command!", NULL); - return TCL_ERROR; - } - } else { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * - (objc + 1)); - newObjv[0] = Tcl_NewStringObj("this", -1); - Tcl_IncrRefCount(newObjv[0]); - val = Tcl_GetVar2(interp, - Tcl_GetString(idmPtr->icPtr->namePtr), NULL, 0); - newObjv[1] = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(newObjv[1]); - memcpy(newObjv+2, objv+1, sizeof(Tcl_Obj *) * (objc -1)); -ItclShowArgs(1, "EVAL2", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, 0); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - } - return result; - } - } - } - if (hPtr == NULL) { - Tcl_AppendResult(interp, "class \"", iclsPtr->nsPtr->fullName, - "\" has no method: \"", Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - return Tcl_NRCallObjProc(interp, NRThisCmd, clientData, objc, objv); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_FindClassesCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::find classes" - * command to query the list of known classes. Handles the following - * syntax: - * - * find classes ?<pattern>? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_FindClassesCmd( - ClientData clientData, /* class/object info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *activeNs = Tcl_GetCurrentNamespace(interp); - Tcl_Namespace *globalNs = Tcl_GetGlobalNamespace(interp); - Tcl_HashTable unique; - Tcl_HashEntry *hPtr; - Tcl_HashSearch place; - Tcl_Command cmd; - Tcl_Command originalCmd; - Tcl_Namespace *nsPtr; - Tcl_Obj *objPtr; - Itcl_Stack search; - char *pattern; - const char *cmdName; - int newEntry; - int handledActiveNs; - int forceFullNames = 0; - - ItclShowArgs(2, "Itcl_FindClassesCmd", objc, objv); - if (objc > 2) { - Tcl_WrongNumArgs(interp, 1, objv, "?pattern?"); - return TCL_ERROR; - } - - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - forceFullNames = (strstr(pattern, "::") != NULL); - } else { - pattern = NULL; - } - - /* - * Search through all commands in the current namespace first, - * in the global namespace next, then in all child namespaces - * in this interpreter. If we find any commands that - * represent classes, report them. - */ - - Itcl_InitStack(&search); - Itcl_PushStack((ClientData)globalNs, &search); - Itcl_PushStack((ClientData)activeNs, &search); /* last in, first out! */ - - Tcl_InitHashTable(&unique, TCL_ONE_WORD_KEYS); - - handledActiveNs = 0; - while (Itcl_GetStackSize(&search) > 0) { - nsPtr = Itcl_PopStack(&search); - if (nsPtr == activeNs && handledActiveNs) { - continue; - } - - hPtr = Tcl_FirstHashEntry(Itcl_GetNamespaceCommandTable(nsPtr), - &place); - while (hPtr) { - cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); - if (Itcl_IsClass(cmd)) { - originalCmd = Tcl_GetOriginalCommand(cmd); - - /* - * Report full names if: - * - the pattern has namespace qualifiers - * - the class namespace is not in the current namespace - * - the class's object creation command is imported from - * another namespace. - * - * Otherwise, report short names. - */ - if (forceFullNames || nsPtr != activeNs || - originalCmd != NULL) { - - objPtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_GetCommandFullName(interp, cmd, objPtr); - cmdName = Tcl_GetString(objPtr); - } else { - cmdName = Tcl_GetCommandName(interp, cmd); - objPtr = Tcl_NewStringObj((const char *)cmdName, -1); - } - - if (originalCmd) { - cmd = originalCmd; - } - Tcl_CreateHashEntry(&unique, (char*)cmd, &newEntry); - - if (newEntry && - ((pattern == NULL) || - Tcl_StringMatch((const char *)cmdName, pattern))) { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - Tcl_GetObjResult(interp), objPtr); - } else { - /* if not appended to the result, free objPtr. */ - Tcl_DecrRefCount(objPtr); - } - - } - hPtr = Tcl_NextHashEntry(&place); - } - handledActiveNs = 1; /* don't process the active namespace twice */ - - /* - * Push any child namespaces onto the stack and continue - * the search in those namespaces. - */ - hPtr = Tcl_FirstHashEntry(Itcl_GetNamespaceChildTable(nsPtr), &place); - while (hPtr != NULL) { - Itcl_PushStack(Tcl_GetHashValue(hPtr), &search); - hPtr = Tcl_NextHashEntry(&place); - } - } - Tcl_DeleteHashTable(&unique); - Itcl_DeleteStack(&search); - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_FindObjectsCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::find objects" - * command to query the list of known objects. Handles the following - * syntax: - * - * find objects ?-class <className>? ?-isa <className>? ?<pattern>? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -int -Itcl_FindObjectsCmd( - ClientData clientData, /* class/object info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *activeNs = Tcl_GetCurrentNamespace(interp); - Tcl_Namespace *globalNs = Tcl_GetGlobalNamespace(interp); - int forceFullNames = 0; - - char *pattern = NULL; - ItclClass *iclsPtr = NULL; - ItclClass *isaDefn = NULL; - - char *name = NULL; - char *token = NULL; - const char *cmdName = NULL; - int pos; - int newEntry; - int match; - int handledActiveNs; - ItclObject *contextIoPtr; - Tcl_HashTable unique; - Tcl_HashEntry *entry; - Tcl_HashSearch place; - Itcl_Stack search; - Tcl_Command cmd; - Tcl_Command originalCmd; - Tcl_CmdInfo cmdInfo; - Tcl_Namespace *nsPtr; - Tcl_Obj *objPtr; - - /* - * Parse arguments: - * objects ?-class <className>? ?-isa <className>? ?<pattern>? - */ - pos = 0; - while (++pos < objc) { - token = Tcl_GetString(objv[pos]); - if (*token != '-') { - if (!pattern) { - pattern = token; - forceFullNames = (strstr(pattern, "::") != NULL); - } else { - break; - } - } - else if ((pos+1 < objc) && (strcmp(token,"-class") == 0)) { - name = Tcl_GetString(objv[pos+1]); - iclsPtr = Itcl_FindClass(interp, name, /* autoload */ 1); - if (iclsPtr == NULL) { - return TCL_ERROR; - } - pos++; - } - else if ((pos+1 < objc) && (strcmp(token,"-isa") == 0)) { - name = Tcl_GetString(objv[pos+1]); - isaDefn = Itcl_FindClass(interp, name, /* autoload */ 1); - if (isaDefn == NULL) { - return TCL_ERROR; - } - pos++; - } else { - - /* - * Last token? Take it as the pattern, even if it starts - * with a "-". This allows us to match object names that - * start with "-". - */ - if (pos == objc-1 && !pattern) { - pattern = token; - forceFullNames = (strstr(pattern, "::") != NULL); - } else { - break; - } - } - } - - if (pos < objc) { - Tcl_WrongNumArgs(interp, 1, objv, - "?-class className? ?-isa className? ?pattern?"); - return TCL_ERROR; - } - - /* - * Search through all commands in the current namespace first, - * in the global namespace next, then in all child namespaces - * in this interpreter. If we find any commands that - * represent objects, report them. - */ - - Itcl_InitStack(&search); - Itcl_PushStack((ClientData)globalNs, &search); - Itcl_PushStack((ClientData)activeNs, &search); /* last in, first out! */ - - Tcl_InitHashTable(&unique, TCL_ONE_WORD_KEYS); - - handledActiveNs = 0; - while (Itcl_GetStackSize(&search) > 0) { - nsPtr = Itcl_PopStack(&search); - if (nsPtr == activeNs && handledActiveNs) { - continue; - } - - entry = Tcl_FirstHashEntry(Itcl_GetNamespaceCommandTable(nsPtr), &place); - while (entry) { - cmd = (Tcl_Command)Tcl_GetHashValue(entry); - if (Itcl_IsObject(cmd)) { - originalCmd = Tcl_GetOriginalCommand(cmd); - if (originalCmd) { - cmd = originalCmd; - } - Tcl_GetCommandInfoFromToken(cmd, &cmdInfo); - contextIoPtr = (ItclObject*)cmdInfo.deleteData; - - /* - * Report full names if: - * - the pattern has namespace qualifiers - * - the class namespace is not in the current namespace - * - the class's object creation command is imported from - * another namespace. - * - * Otherwise, report short names. - */ - if (forceFullNames || nsPtr != activeNs || - originalCmd != NULL) { - - objPtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_GetCommandFullName(interp, cmd, objPtr); - cmdName = Tcl_GetString(objPtr); - } else { - cmdName = Tcl_GetCommandName(interp, cmd); - objPtr = Tcl_NewStringObj((const char *)cmdName, -1); - } - - Tcl_CreateHashEntry(&unique, (char*)cmd, &newEntry); - - match = 0; - if (newEntry && - (!pattern || Tcl_StringMatch((const char *)cmdName, - pattern))) { - if ((iclsPtr == NULL) || - (contextIoPtr->iclsPtr == iclsPtr)) { - if (isaDefn == NULL) { - match = 1; - } else { - entry = Tcl_FindHashEntry( - &contextIoPtr->iclsPtr->heritage, - (char*)isaDefn); - - if (entry) { - match = 1; - } - } - } - } - - if (match) { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - Tcl_GetObjResult(interp), objPtr); - } else { - Tcl_DecrRefCount(objPtr); /* throw away the name */ - } - } - entry = Tcl_NextHashEntry(&place); - } - handledActiveNs = 1; /* don't process the active namespace twice */ - - /* - * Push any child namespaces onto the stack and continue - * the search in those namespaces. - */ - entry = Tcl_FirstHashEntry(Itcl_GetNamespaceChildTable(nsPtr), &place); - while (entry != NULL) { - Itcl_PushStack(Tcl_GetHashValue(entry), &search); - entry = Tcl_NextHashEntry(&place); - } - } - Tcl_DeleteHashTable(&unique); - Itcl_DeleteStack(&search); - - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DelClassCmd() - * - * Part of the "delete" ensemble. Invoked by Tcl whenever the - * user issues a "delete class" command to delete classes. - * Handles the following syntax: - * - * delete class <name> ?<name>...? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -NRDelClassCmd( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int i; - char *name; - ItclClass *iclsPtr; - - ItclShowArgs(1, "Itcl_DelClassCmd", objc, objv); - /* - * Since destroying a base class will destroy all derived - * classes, calls like "destroy class Base Derived" could - * fail. Break this into two passes: first check to make - * sure that all classes on the command line are valid, - * then delete them. - */ - for (i=1; i < objc; i++) { - name = Tcl_GetString(objv[i]); - iclsPtr = Itcl_FindClass(interp, name, /* autoload */ 1); - if (iclsPtr == NULL) { - return TCL_ERROR; - } - } - - for (i=1; i < objc; i++) { - name = Tcl_GetString(objv[i]); - iclsPtr = Itcl_FindClass(interp, name, /* autoload */ 0); - - if (iclsPtr) { - Tcl_ResetResult(interp); - if (Itcl_DeleteClass(interp, iclsPtr) != TCL_OK) { - return TCL_ERROR; - } - } - } - Tcl_ResetResult(interp); - return TCL_OK; -} - -/* ARGSUSED */ -int -Itcl_DelClassCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRDelClassCmd, clientData, objc, objv); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_DelObjectCmd() - * - * Part of the "delete" ensemble. Invoked by Tcl whenever the user - * issues a "delete object" command to delete [incr Tcl] objects. - * Handles the following syntax: - * - * delete object <name> ?<name>...? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -static int -CallDeleteObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ItclObject *contextIoPtr = data[0]; - if (contextIoPtr->destructorHasBeenCalled) { - Tcl_AppendResult(interp, "can't delete an object while it is being ", - "destructed", NULL); - return TCL_ERROR; - } - if (result == TCL_OK) { - result = Itcl_DeleteObject(interp, contextIoPtr); - } - return result; -} - -static int -NRDelObjectCmd( - ClientData clientData, /* object management info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObject *contextIoPtr; - char *name; - void *callbackPtr; - int i; - int result; - - ItclShowArgs(1, "Itcl_DelObjectCmd", objc, objv); - /* - * Scan through the list of objects and attempt to delete them. - * If anything goes wrong (i.e., destructors fail), then - * abort with an error. - */ - for (i=1; i < objc; i++) { - name = Tcl_GetStringFromObj(objv[i], (int*)NULL); - contextIoPtr = NULL; - if (Itcl_FindObject(interp, name, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "object \"", name, "\" not found", - (char*)NULL); - return TCL_ERROR; - } - - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, CallDeleteObject, contextIoPtr, - NULL, NULL, NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - return TCL_OK; -} - -/* ARGSUSED */ -int -Itcl_DelObjectCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRDelObjectCmd, clientData, objc, objv); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ScopeCmd() - * - * Invoked by Tcl whenever the user issues a "scope" command to - * create a fully qualified variable name. Handles the following - * syntax: - * - * scope <variable> - * - * If the input string is already fully qualified (starts with "::"), - * then this procedure does nothing. Otherwise, it looks for a - * data member called <variable> and returns its fully qualified - * name. If the <variable> is a common data member, this procedure - * returns a name of the form: - * - * ::namesp::namesp::class::variable - * - * If the <variable> is an instance variable, this procedure returns - * a name in a format that Tcl can use to find the same variable from - * any context. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ScopeCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNsPtr; - Tcl_HashEntry *hPtr; - Tcl_Object oPtr; - Tcl_InterpDeleteProc *procPtr; - Tcl_Obj *objPtr2; - Tcl_Var var; - Tcl_HashEntry *entry; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObjectInfo *infoPtr; - ItclVarLookup *vlookup; - char *openParen; - register char *p; - char *token; - int doAppend; - int result; - - ItclShowArgs(1, "Itcl_ScopeCmd", objc, objv); - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "varname"); - return TCL_ERROR; - } - - contextNsPtr = Tcl_GetCurrentNamespace(interp); - openParen = NULL; - result = TCL_OK; - /* - * If this looks like a fully qualified name already, - * then return it as is. - */ - token = Tcl_GetStringFromObj(objv[1], (int*)NULL); - if (*token == ':' && *(token+1) == ':') { - Tcl_SetObjResult(interp, objv[1]); - return TCL_OK; - } - - /* - * If the variable name is an array reference, pick out - * the array name and use that for the lookup operations - * below. - */ - for (p=token; *p != '\0'; p++) { - if (*p == '(') { - openParen = p; - } - else if (*p == ')' && openParen) { - *openParen = '\0'; - break; - } - } - - /* - * Figure out what context we're in. If this is a class, - * then look up the variable in the class definition. - * If this is a namespace, then look up the variable in its - * varTable. Note that the normal Itcl_GetContext function - * returns an error if we're not in a class context, so we - * perform a similar function here, the hard way. - * - * TRICKY NOTE: If this is an array reference, we'll get - * the array variable as the variable name. We must be - * careful to add the index (everything from openParen - * onward) as well. - */ - contextIoPtr = NULL; - contextIclsPtr = NULL; - oPtr = NULL; - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)contextNsPtr); - if (hPtr != NULL) { - contextIclsPtr = (ItclClass *)Tcl_GetHashValue(hPtr); - } - if (Itcl_IsClassNamespace(contextNsPtr)) { - ClientData clientData; - - entry = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, token); - if (!entry) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "variable \"", token, "\" not found in class \"", - Tcl_GetString(contextIclsPtr->fullNamePtr), "\"", - (char*)NULL); - result = TCL_ERROR; - goto scopeCmdDone; - } - vlookup = (ItclVarLookup*)Tcl_GetHashValue(entry); - - if (vlookup->ivPtr->flags & ITCL_COMMON) { - Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); - if (vlookup->ivPtr->protection != ITCL_PUBLIC) { - Tcl_AppendToObj(resultPtr, ITCL_VARIABLES_NAMESPACE, -1); - } - Tcl_AppendToObj(resultPtr, - Tcl_GetString(vlookup->ivPtr->fullNamePtr), -1); - if (openParen) { - *openParen = '('; - Tcl_AppendToObj(resultPtr, openParen, -1); - openParen = NULL; - } - result = TCL_OK; - goto scopeCmdDone; - } - - /* - * If this is not a common variable, then we better have - * an object context. Return the name as a fully qualified name. - */ - infoPtr = contextIclsPtr->infoPtr; - clientData = Itcl_GetCallFrameClientData(interp); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject((Tcl_ObjectContext)clientData); - if (oPtr != NULL) { - contextIoPtr = (ItclObject*)Tcl_ObjectGetMetadata( - oPtr, infoPtr->object_meta_type); - } - } - - if (contextIoPtr == NULL) { - if (infoPtr->currIoPtr != NULL) { - contextIoPtr = infoPtr->currIoPtr; - } - } - if (contextIoPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "can't scope variable \"", token, - "\": missing object context", - (char*)NULL); - result = TCL_ERROR; - goto scopeCmdDone; - } - - doAppend = 1; - if (contextIclsPtr->flags & ITCL_ECLASS) { - if (strcmp(token, "itcl_options") == 0) { - doAppend = 0; - } - } - - objPtr2 = Tcl_NewStringObj((char*)NULL, 0); - Tcl_IncrRefCount(objPtr2); - Tcl_AppendToObj(objPtr2, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr2, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr))->fullName, -1); - - if (doAppend) { - Tcl_AppendToObj(objPtr2, - Tcl_GetString(vlookup->ivPtr->fullNamePtr), -1); - } else { - Tcl_AppendToObj(objPtr2, "::", -1); - Tcl_AppendToObj(objPtr2, - Tcl_GetString(vlookup->ivPtr->namePtr), -1); - } - - if (openParen) { - *openParen = '('; - Tcl_AppendToObj(objPtr2, openParen, -1); - openParen = NULL; - } - /* fix for SF bug #238 use Tcl_AppendResult instead of Tcl_AppendElement */ - Tcl_AppendResult(interp, Tcl_GetString(objPtr2), NULL); - Tcl_DecrRefCount(objPtr2); - } else { - - /* - * We must be in an ordinary namespace context. Resolve - * the variable using Tcl_FindNamespaceVar. - * - * TRICKY NOTE: If this is an array reference, we'll get - * the array variable as the variable name. We must be - * careful to add the index (everything from openParen - * onward) as well. - */ - Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); - - var = Itcl_FindNamespaceVar(interp, token, contextNsPtr, - TCL_NAMESPACE_ONLY); - - if (!var) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "variable \"", token, "\" not found in namespace \"", - contextNsPtr->fullName, "\"", - (char*)NULL); - result = TCL_ERROR; - goto scopeCmdDone; - } - - Itcl_GetVariableFullName(interp, var, resultPtr); - if (openParen) { - *openParen = '('; - Tcl_AppendToObj(resultPtr, openParen, -1); - openParen = NULL; - } - } - -scopeCmdDone: - if (openParen) { - *openParen = '('; - } - return result; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_CodeCmd() - * - * Invoked by Tcl whenever the user issues a "code" command to - * create a scoped command string. Handles the following syntax: - * - * code ?-namespace foo? arg ?arg arg ...? - * - * Unlike the scope command, the code command DOES NOT look for - * scoping information at the beginning of the command. So scopes - * will nest in the code command. - * - * The code command is similar to the "namespace code" command in - * Tcl, but it preserves the list structure of the input arguments, - * so it is a lot more useful. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_CodeCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNs = Tcl_GetCurrentNamespace(interp); - - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - const char *token; - int pos; - - ItclShowArgs(1, "Itcl_CodeCmd", objc, objv); - /* - * Handle flags like "-namespace"... - */ - for (pos=1; pos < objc; pos++) { - token = Tcl_GetStringFromObj(objv[pos], (int*)NULL); - if (*token != '-') { - break; - } - - if (strcmp(token, "-namespace") == 0) { - if (objc == 2) { - Tcl_WrongNumArgs(interp, 1, objv, - "?-namespace name? command ?arg arg...?"); - return TCL_ERROR; - } else { - token = Tcl_GetString(objv[pos+1]); - contextNs = Tcl_FindNamespace(interp, token, - (Tcl_Namespace*)NULL, TCL_LEAVE_ERR_MSG); - - if (!contextNs) { - return TCL_ERROR; - } - pos++; - } - } else { - if (strcmp(token, "--") == 0) { - pos++; - break; - } else { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad option \"", token, "\": should be -namespace or --", - (char*)NULL); - return TCL_ERROR; - } - } - } - - if (objc < 2) { - Tcl_WrongNumArgs(interp, 1, objv, - "?-namespace name? command ?arg arg...?"); - return TCL_ERROR; - } - - /* - * Now construct a scoped command by integrating the - * current namespace context, and appending the remaining - * arguments AS A LIST... - */ - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("namespace", -1)); - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("inscope", -1)); - - if (contextNs == Tcl_GetGlobalNamespace(interp)) { - objPtr = Tcl_NewStringObj("::", -1); - } else { - objPtr = Tcl_NewStringObj(contextNs->fullName, -1); - } - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - - if (objc-pos == 1) { - objPtr = objv[pos]; - } else { - objPtr = Tcl_NewListObj(objc-pos, &objv[pos]); - } - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - Tcl_SetResult(interp, Tcl_GetString(listPtr), TCL_VOLATILE); - Tcl_DecrRefCount(listPtr); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsObjectCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::is object" - * command to test whether the argument is an object or not. - * syntax: - * - * itcl::is object ?-class classname? commandname - * - * Returns 1 if it is an object, 0 otherwise - * ------------------------------------------------------------------------ - */ -int -Itcl_IsObjectCmd( - ClientData clientData, /* class/object info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - - int classFlag = 0; - int idx = 0; - char *name = NULL; - char *cname; - char *cmdName; - char *token; - Tcl_Command cmd; - Tcl_Namespace *contextNs = NULL; - ItclClass *iclsPtr = NULL; - - /* - * Handle the arguments. - * objc needs to be either: - * 2 itcl::is object commandname - * 4 itcl::is object -class classname commandname - */ - if (objc != 2 && objc != 4) { - Tcl_WrongNumArgs(interp, 1, objv, "?-class classname? commandname"); - return TCL_ERROR; - } - - /* - * Parse the command args. Look for the -class - * keyword. - */ - for (idx=1; idx < objc; idx++) { - token = Tcl_GetString(objv[idx]); - - if (strcmp(token,"-class") == 0) { - cname = Tcl_GetString(objv[idx+1]); - iclsPtr = Itcl_FindClass(interp, cname, /* no autoload */ 0); - - if (iclsPtr == NULL) { - return TCL_ERROR; - } - - idx++; - classFlag = 1; - } else { - name = Tcl_GetString(objv[idx]); - } - - } /* end for objc loop */ - - - /* - * The object name may be a scoped value of the form - * "namespace inscope <namesp> <command>". If it is, - * decode it. - */ - if (Itcl_DecodeScopedCommand(interp, name, &contextNs, &cmdName) - != TCL_OK) { - return TCL_ERROR; - } - - cmd = Tcl_FindCommand(interp, cmdName, contextNs, /* flags */ 0); - - /* - * Need the NULL test, or the test will fail if cmd is NULL - */ - if (cmd == NULL || ! Itcl_IsObject(cmd)) { - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0)); - ckfree((char *)cmdName); - return TCL_OK; - } - - /* - * Handle the case when the -class flag is given - */ - if (classFlag) { - ItclObject *contextIoPtr; - if (Itcl_FindObject(interp, cmdName, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr == NULL) { - /* seems that we are in constructor, so look for currIoPtr in info structure */ - contextIoPtr = iclsPtr->infoPtr->currIoPtr; - } - if (! Itcl_ObjectIsa(contextIoPtr, iclsPtr)) { - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0)); - ckfree((char *)cmdName); - return TCL_OK; - } - - } - - /* - * Got this far, so assume that it is a valid object - */ - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); - ckfree(cmdName); - - return TCL_OK; -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsClassCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::is class" - * command to test whether the argument is an itcl class or not - * syntax: - * - * itcl::is class commandname - * - * Returns 1 if it is a class, 0 otherwise - * ------------------------------------------------------------------------ - */ -int -Itcl_IsClassCmd( - ClientData clientData, /* class/object info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - - char *cname; - char *name; - ItclClass *iclsPtr = NULL; - Tcl_Namespace *contextNs = NULL; - - /* - * Need itcl::is class classname - */ - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "commandname"); - return TCL_ERROR; - } - - name = Tcl_GetString(objv[1]); - - /* - * The object name may be a scoped value of the form - * "namespace inscope <namesp> <command>". If it is, - * decode it. - */ - if (Itcl_DecodeScopedCommand(interp, name, &contextNs, &cname) != TCL_OK) { - return TCL_ERROR; - } - - iclsPtr = Itcl_FindClass(interp, cname, /* no autoload */ 0); - - /* - * If classDefn is NULL, then it wasn't found, hence it - * isn't a class - */ - if (iclsPtr != NULL) { - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); - } else { - Tcl_SetObjResult(interp, Tcl_NewBooleanObj(0)); - } - - ckfree(cname); - - return TCL_OK; - -} /* end Itcl_IsClassCmd function */ - -/* - * ------------------------------------------------------------------------ - * Itcl_FilterCmd() - * - * Used to add a filter command to an object which is called just before - * a method/proc of a class is executed - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_FilterAddCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj **newObjv; - int result; - - ItclShowArgs(1, "Itcl_FilterCmd", objc, objv); -/* Tcl_Namespace *contextNs = Tcl_GetCurrentNamespace(interp); */ -/* FIXME need to change the chain command to do the same here as the TclOO next command !! */ - if (objc < 3) { - Tcl_WrongNumArgs(interp, 1, objv, "<className> <filterName> ?<filterName> ...?"); - return TCL_ERROR; - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+1)); - newObjv[0] = Tcl_NewStringObj("::oo::define", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = objv[1]; - newObjv[2] = Tcl_NewStringObj("filter", -1); - Tcl_IncrRefCount(newObjv[2]); - memcpy(newObjv+3, objv+2, sizeof(Tcl_Obj *)*(objc-2)); - ItclShowArgs(1, "Itcl_FilterAddCmd2", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[2]); - - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_FilterDeleteCmd() - * - * used to delete filter commands of a class or object - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_FilterDeleteCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(1, "Itcl_FilterDeleteCmd", objc, objv); -/* Tcl_Namespace *contextNs = Tcl_GetCurrentNamespace(interp); */ - - Tcl_AppendResult(interp, "::itcl::filter delete command not yet implemented", NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ForwardAddCmd() - * - * Used to similar to iterp alias to forward the call of a method - * to another method within the class - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ForwardAddCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *prefixObj; - Tcl_Method mPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - - ItclShowArgs(1, "Itcl_ForwardAddCmd", objc, objv); - if (objc < 3) { - Tcl_WrongNumArgs(interp, 1, objv, "<forwardName> <targetName> ?<arg> ...?"); - return TCL_ERROR; - } - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_HashEntry *hPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->nameClasses, (char *)objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "class: \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - iclsPtr = Tcl_GetHashValue(hPtr); - } - prefixObj = Tcl_NewListObj(objc-2, objv+2); - mPtr = Itcl_NewForwardClassMethod(interp, iclsPtr->clsPtr, 1, - objv[1], prefixObj); - if (mPtr == NULL) { - return TCL_ERROR; - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ForwardDeleteCmd() - * - * used to delete forwarded commands of a class or object - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ForwardDeleteCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(1, "Itcl_ForwardDeleteCmd", objc, objv); -/* Tcl_Namespace *contextNs = Tcl_GetCurrentNamespace(interp); */ - - Tcl_AppendResult(interp, "::itcl::forward delete command not yet implemented", NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_MixinAddCmd() - * - * Used to add the methods of a class to another class without heritance - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_MixinAddCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj **newObjv; - int result; - - ItclShowArgs(1, "Itcl_MixinAddCmd", objc, objv); - if (objc < 3) { - Tcl_WrongNumArgs(interp, 1, objv, "<className> <mixinName> ?<mixinName> ...?"); - return TCL_ERROR; - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+1)); - newObjv[0] = Tcl_NewStringObj("::oo::define", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = objv[1]; - newObjv[2] = Tcl_NewStringObj("mixin", -1); - Tcl_IncrRefCount(newObjv[2]); - memcpy(newObjv+3, objv+2, sizeof(Tcl_Obj *)*(objc-2)); - ItclShowArgs(1, "Itcl_MixinAddCmd2", objc+1, newObjv); - result = Tcl_EvalObjv(interp, objc+1, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[2]); - - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_MixinDeleteCmd() - * - * Used to delete the methods of a class to another class without heritance - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_MixinDeleteCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(1, "Itcl_MixinDeleteCmd", objc, objv); -/* Tcl_Namespace *contextNs = Tcl_GetCurrentNamespace(interp); */ - - Tcl_AppendResult(interp, "::itcl::mixin delete command not yet implemented", NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_NWidgetCmd() - * - * Used to build an [incr Tcl] nwidget - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_NWidgetCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - int result; - - iclsPtr = NULL; - ItclShowArgs(0, "Itcl_NWidgetCmd", objc-1, objv); - result = ItclClassBaseCmd(clientData, interp, ITCL_ECLASS|ITCL_NWIDGET, objc, objv, - &iclsPtr); - if (result != TCL_OK) { - return result; - } - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Itcl_NWidgetCmd!iclsPtr == NULL\n", NULL); - result = TCL_ERROR; - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AddOptionCmd() - * - * Used to build an option to an [incr Tcl] nwidget/eclass - * - * Syntax: ::itcl::addoption <nwidget class> <protection> <optionName> <defaultValue> - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_AddOptionCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - const char *protectionStr; - int pLevel; - int result; - - result = TCL_OK; - infoPtr = (ItclObjectInfo *)clientData; - ItclShowArgs(1, "Itcl_AddOptionCmd", objc, objv); - if (objc < 4) { - Tcl_WrongNumArgs(interp, 1, objv, - "className protection option optionName ..."); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&infoPtr->nameClasses, (char *)objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "class \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - iclsPtr = Tcl_GetHashValue(hPtr); - protectionStr = Tcl_GetString(objv[2]); - pLevel = -1; - if (strcmp(protectionStr, "public") == 0) { - pLevel = ITCL_PUBLIC; - } - if (strcmp(protectionStr, "protected") == 0) { - pLevel = ITCL_PROTECTED; - } - if (strcmp(protectionStr, "private") == 0) { - pLevel = ITCL_PRIVATE; - } - if (pLevel == -1) { - Tcl_AppendResult(interp, "bad protection \"", protectionStr, "\"", - NULL); - return TCL_ERROR; - } - Itcl_PushStack((ClientData)iclsPtr, &infoPtr->clsStack); - result = Itcl_ClassOptionCmd(clientData, interp, objc-2, objv+2); - Itcl_PopStack(&infoPtr->clsStack); - if (result != TCL_OK) { - return result; - } - result = DelegatedOptionsInstall(interp, iclsPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AddObjectOptionCmd() - * - * Used to build an option for an [incr Tcl] object - * - * Syntax: ::itcl::addobjectoption <object> <protection> option <optionSpec> - * ?-default <defaultValue>? - * ?-configuremethod <configuremethod>? - * ?-validatemethod <validatemethod>? - * ?-cgetmethod <cgetmethod>? - * ?-configuremethodvar <configuremethodvar>? - * ?-validatemethodvar <validatemethodvar>? - * ?-cgetmethodvar <cgetmethodvar>? - * ?-readonly? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_AddObjectOptionCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Command cmd; - Tcl_Obj *objPtr; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclOption *ioptPtr; - const char *protectionStr; - int pLevel; - int isNew; - - ioptPtr = NULL; - infoPtr = (ItclObjectInfo *)clientData; - ItclShowArgs(1, "Itcl_AddObjectOptionCmd", objc, objv); - if (objc < 4) { - Tcl_WrongNumArgs(interp, 1, objv, - "objectName protection option optionName ..."); - return TCL_ERROR; - } - - cmd = Tcl_FindCommand(interp, Tcl_GetString(objv[1]), NULL, 0); - if (cmd == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&infoPtr->objectCmds, (char *)cmd); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - ioPtr = Tcl_GetHashValue(hPtr); - protectionStr = Tcl_GetString(objv[2]); - pLevel = -1; - if (strcmp(protectionStr, "public") == 0) { - pLevel = ITCL_PUBLIC; - } - if (strcmp(protectionStr, "protected") == 0) { - pLevel = ITCL_PROTECTED; - } - if (strcmp(protectionStr, "private") == 0) { - pLevel = ITCL_PRIVATE; - } - if (pLevel == -1) { - Tcl_AppendResult(interp, "bad protection \"", protectionStr, "\"", - NULL); - return TCL_ERROR; - } - infoPtr->protection = pLevel; - if (ItclParseOption(infoPtr, interp, objc-3, objv+3, NULL, ioPtr, - &ioptPtr) != TCL_OK) { - return TCL_ERROR; - } - objPtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - ioptPtr->fullNamePtr = Tcl_NewStringObj( - Tcl_GetString(ioPtr->namePtr), -1); - Tcl_AppendToObj(ioptPtr->fullNamePtr, "::", 2); - Tcl_AppendToObj(ioptPtr->fullNamePtr, Tcl_GetString(ioptPtr->namePtr), -1); - Tcl_IncrRefCount(ioptPtr->fullNamePtr); - hPtr = Tcl_CreateHashEntry(&ioPtr->objectOptions, - (char *)ioptPtr->namePtr, &isNew); - Tcl_SetHashValue(hPtr, ioptPtr); - ItclSetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), - Tcl_GetString(ioptPtr->defaultValuePtr), ioPtr, NULL); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AddDelegatedOptionCmd() - * - * Used to build an option to an [incr Tcl] nwidget/eclass - * - * Syntax: ::itcl::adddelegatedoption <nwidget object> <optionName> <defaultValue> - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_AddDelegatedOptionCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Command cmd; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclDelegatedOption *idoPtr; - int isNew; - int result; - - result = TCL_OK; - infoPtr = (ItclObjectInfo *)clientData; - ItclShowArgs(1, "Itcl_AddDelegatedOptionCmd", objc, objv); - if (objc < 4) { - Tcl_WrongNumArgs(interp, 1, objv, - "className protection option optionName ..."); - return TCL_ERROR; - } - - cmd = Tcl_FindCommand(interp, Tcl_GetString(objv[1]), NULL, 0); - if (cmd == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&infoPtr->objectCmds, (char *)cmd); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - ioPtr = Tcl_GetHashValue(hPtr); - result = Itcl_HandleDelegateOptionCmd(interp, ioPtr, NULL, &idoPtr, - objc-3, objv+3); - if (result != TCL_OK) { - return result; - } - hPtr = Tcl_CreateHashEntry(&ioPtr->objectDelegatedOptions, - (char *)idoPtr->namePtr, &isNew); - Tcl_SetHashValue(hPtr, idoPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AddDelegatedFunctionCmd() - * - * Used to build an function to an [incr Tcl] nwidget/eclass - * - * Syntax: ::itcl::adddelegatedfunction <nwidget object> <fucntionName> ... - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_AddDelegatedFunctionCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Command cmd; - Tcl_Obj *componentNamePtr; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - ItclHierIter hier; - const char *val; - int isNew; - int result; - - result = TCL_OK; - infoPtr = (ItclObjectInfo *)clientData; - ItclShowArgs(1, "Itcl_AddDelegatedFunctionCmd", objc, objv); - if (objc < 4) { - Tcl_WrongNumArgs(interp, 1, objv, - "className protection method/proc functionName ..."); - return TCL_ERROR; - } - - cmd = Tcl_FindCommand(interp, Tcl_GetString(objv[1]), NULL, 0); - if (cmd == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&infoPtr->objectCmds, (char *)cmd); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" not found", NULL); - return TCL_ERROR; - } - ioPtr = Tcl_GetHashValue(hPtr); - result = Itcl_HandleDelegateMethodCmd(interp, ioPtr, NULL, &idmPtr, - objc-3, objv+3); - if (result != TCL_OK) { - return result; - } - componentNamePtr = idmPtr->icPtr->namePtr; - Itcl_InitHierIter(&hier, ioPtr->iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->components, (char *) - componentNamePtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - val = Itcl_GetInstanceVar(interp, - Tcl_GetString(componentNamePtr), ioPtr, iclsPtr); - componentNamePtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(componentNamePtr); - DelegateFunction(interp, ioPtr, ioPtr->iclsPtr, componentNamePtr, idmPtr); - hPtr = Tcl_CreateHashEntry(&ioPtr->objectDelegatedFunctions, - (char *)idmPtr->namePtr, &isNew); - Tcl_DecrRefCount(componentNamePtr); - Tcl_SetHashValue(hPtr, idmPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AddComponentCmd() - * - * Used to add a component to an [incr Tcl] nwidget/eclass - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_AddComponentCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_DString buffer; - Tcl_DString buffer2; - Tcl_Namespace *varNsPtr; - Tcl_Namespace *nsPtr; - Tcl_CallFrame frame; - Tcl_Var varPtr; - ItclVarLookup *vlookup; - ItclObject *contextIoPtr; - ItclClass *contextIclsPtr; - ItclComponent *icPtr; - ItclVariable *ivPtr; - const char *varName; - int isNew; - int result; - - result = TCL_OK; - contextIoPtr = NULL; - ItclShowArgs(1, "Itcl_AddComponentCmd", objc, objv); - if (objc < 3) { - Tcl_WrongNumArgs(interp, 1, objv, - "objectName componentName"); - return TCL_ERROR; - } - if (Itcl_FindObject(interp, Tcl_GetString(objv[1]), &contextIoPtr) - != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr == NULL) { - Tcl_AppendResult(interp, "Itcl_AddComponentCmd contextIoPtr " - "for \"", Tcl_GetString(objv[1]), "\" == NULL", NULL); - return TCL_ERROR; - } - contextIclsPtr = contextIoPtr->iclsPtr; - hPtr = Tcl_CreateHashEntry(&contextIoPtr->objectComponents, (char *)objv[2], - &isNew); - if (!isNew) { - Tcl_AppendResult(interp, "Itcl_AddComponentCmd component \"", - Tcl_GetString(objv[2]), "\" already exists for object \"", - Tcl_GetString(objv[1]), "\"", NULL); - return TCL_ERROR; - } - if (ItclCreateComponent(interp, contextIclsPtr, objv[2], /* not common */0, - &icPtr) != TCL_OK) { - return TCL_ERROR; - } - ItclAddClassComponentDictInfo(interp, contextIclsPtr, icPtr); - contextIclsPtr->numVariables++; - Tcl_SetHashValue(hPtr, icPtr); - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr))->fullName, -1); - Tcl_DStringAppend(&buffer, contextIclsPtr->nsPtr->fullName, -1); - varNsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), - NULL, 0); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->variables, (char *)objv[2]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "Itcl_AddComponentCmd cannot find component", - " \"", Tcl_GetString(objv[2]), "\"in class variables", NULL); - return TCL_ERROR; - } - ivPtr = Tcl_GetHashValue(hPtr); - /* add entry to the virtual tables */ - vlookup = (ItclVarLookup *)ckalloc(sizeof(ItclVarLookup)); - vlookup->ivPtr = ivPtr; - vlookup->usage = 0; - vlookup->leastQualName = NULL; - - /* - * If this variable is PRIVATE to another class scope, - * then mark it as "inaccessible". - */ - vlookup->accessible = (ivPtr->protection != ITCL_PRIVATE || - ivPtr->iclsPtr == contextIclsPtr); - - vlookup->varNum = contextIclsPtr->numInstanceVars++; - /* - * Create all possible names for this variable and enter - * them into the variable resolution table: - * var - * class::var - * namesp1::class::var - * namesp2::namesp1::class::var - * ... - */ - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, Tcl_GetString(ivPtr->namePtr), -1); - nsPtr = contextIclsPtr->nsPtr; - - Tcl_DStringInit(&buffer2); - while (1) { - hPtr = Tcl_CreateHashEntry(&contextIclsPtr->resolveVars, - Tcl_DStringValue(&buffer), &isNew); - - if (isNew) { - Tcl_SetHashValue(hPtr, (ClientData)vlookup); - vlookup->usage++; - - if (!vlookup->leastQualName) { - vlookup->leastQualName = - Tcl_GetHashKey(&contextIclsPtr->resolveVars, hPtr); - } -#ifdef NEW_PROTO_RESOLVER - Itcl_RegisterClassVariable(contextIclsPtr->infoPtr->interp, - contextIclsPtr->nsPtr, Tcl_DStringValue(&buffer), - vlookup->classVarInfoPtr); -#endif - } - - if (nsPtr == NULL) { - break; - } - Tcl_DStringSetLength(&buffer2, 0); - Tcl_DStringAppend(&buffer2, Tcl_DStringValue(&buffer), -1); - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, nsPtr->name, -1); - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, Tcl_DStringValue(&buffer2), -1); - - nsPtr = nsPtr->parentPtr; - } - Tcl_DStringFree(&buffer2); - Tcl_DStringFree(&buffer); - - - - varName = Tcl_GetString(ivPtr->namePtr); - /* now initialize the variable */ - if (Itcl_PushCallFrame(interp, &frame, varNsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - return TCL_ERROR; - } - if (Tcl_SetVar2(interp, varName, NULL, - "", TCL_NAMESPACE_ONLY) == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR cannot set", - " variable \"", varName, "\"\n", NULL); - result = TCL_ERROR; - } - Itcl_PopCallFrame(interp); - varPtr = Tcl_NewNamespaceVar(interp, varNsPtr, - Tcl_GetString(ivPtr->namePtr)); - hPtr = Tcl_CreateHashEntry(&contextIoPtr->objectVariables, - (char *)ivPtr, &isNew); - if (isNew) { - Itcl_PreserveVar(varPtr); - Tcl_SetHashValue(hPtr, varPtr); - } else { - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_SetComponentCmd() - * - * Used to set a component for an [incr Tcl] nwidget/eclass - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_SetComponentCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - ItclClass *iclsPtr; - ItclObject *contextIoPtr; - ItclClass *contextIclsPtr; - ItclComponent *icPtr; - ItclDelegatedOption *idoPtr; - ItclHierIter hier; - const char *name; - const char *val; - int result; - - result = TCL_OK; - contextIoPtr = NULL; - ItclShowArgs(1, "Itcl_SetComponentCmd", objc, objv); - if (objc < 4) { - Tcl_WrongNumArgs(interp, 1, objv, - "objectName componentName value"); - return TCL_ERROR; - } - name = Tcl_GetStringFromObj(objv[1], (int*)NULL); - if (Itcl_FindObject(interp, name, &contextIoPtr) != TCL_OK) { - return TCL_ERROR; - } - if (contextIoPtr == NULL) { - Tcl_AppendResult(interp, "Itcl_SetComponentCmd contextIoPtr " - "for \"", Tcl_GetString(objv[1]), "\" == NULL", NULL); - return TCL_ERROR; - } - Itcl_InitHierIter(&hier, contextIoPtr->iclsPtr); - hPtr = NULL; - while ((contextIclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->components, (char *)objv[2]); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "object \"", Tcl_GetString(objv[1]), - "\" has no component \"", Tcl_GetString(objv[2]), "\"", NULL); - return TCL_ERROR; - } - icPtr = Tcl_GetHashValue(hPtr); - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), NULL, - contextIoPtr, contextIclsPtr); - if ((val != NULL) && (strlen(val) != 0)) { - /* delete delegated options to the old component here !! */ - Itcl_InitHierIter(&hier, contextIoPtr->iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - FOREACH_HASH_VALUE(idoPtr, &iclsPtr->delegatedOptions) { - if (strcmp(Tcl_GetString(idoPtr->icPtr->namePtr), - Tcl_GetString(objv[2])) == 0) { - Tcl_DeleteHashEntry(hPtr); - } - } - } - Itcl_DeleteHierIter(&hier); - } - if (ItclSetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), NULL, - Tcl_GetString(objv[3]), contextIoPtr, contextIclsPtr) == NULL) { - return TCL_ERROR; - } - val = ItclGetInstanceVar(interp, Tcl_GetString(icPtr->namePtr), NULL, - contextIoPtr, contextIclsPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ExtendedClassCmd() - * - * Used to create an [incr Tcl] extended class. - * An extended class is like a class with additional functionality/ - * commands - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ExtendedClassCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - int result; - - ItclShowArgs(1, "Itcl_ExtendedClassCmd", objc-1, objv); - result = ItclClassBaseCmd(clientData, interp, ITCL_ECLASS, objc, objv, - &iclsPtr); - if ((iclsPtr == NULL) && (result == TCL_OK)) { - ItclShowArgs(0, "Itcl_ExtendedClassCmd iclsPtr == NULL", objc-1, objv); - return TCL_ERROR; - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_TypeClassCmd() - * - * Used to create an [incr Tcl] type class. - * An type class is like a class with additional functionality/ - * commands. it has no methods and vars but only the equivalent - * of proc and common namely typemethod and typevariable - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_TypeClassCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr; - ItclClass *iclsPtr; - int result; - - ItclShowArgs(1, "Itcl_TypeClassCmd", objc-1, objv); - result = ItclClassBaseCmd(clientData, interp, ITCL_TYPE, objc, objv, - &iclsPtr); - if ((iclsPtr == NULL) && (result == TCL_OK)) { - ItclShowArgs(0, "Itcl_TypeClassCmd iclsPtr == NULL", objc-1, objv); - return TCL_ERROR; - } - if (result != TCL_OK) { - return result; - } - /* we handle create by ourself !! */ - objPtr = Tcl_NewStringObj("oo::objdefine ", -1); - Tcl_AppendToObj(objPtr, iclsPtr->nsPtr->fullName, -1); - Tcl_AppendToObj(objPtr, " unexport create", -1); - Tcl_IncrRefCount(objPtr); - result = Tcl_EvalObjEx(interp, objPtr, 0); - Tcl_DecrRefCount(objPtr); - objPtr = Tcl_NewStringObj(iclsPtr->nsPtr->fullName, -1); - Tcl_SetResult(interp, Tcl_GetString(objPtr), TCL_VOLATILE); - Tcl_DecrRefCount(objPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassHullTypeCmd() - * - * Used to set a hulltype for a widget - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ClassHullTypeCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - const char *hullTypeName; - int correctArg; - - infoPtr = (ItclObjectInfo *)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - ItclShowArgs(1, "Itcl_ClassHullTypeCmd", objc-1, objv); - if (iclsPtr->flags & ITCL_TYPE) { - Tcl_AppendResult(interp, "can't set hulltype for ::itcl::type", - NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - Tcl_AppendResult(interp, "can't set hulltype for ", - "::itcl::widgetadaptor", NULL); - return TCL_ERROR; - } - if (objc != 2) { - Tcl_AppendResult(interp, "wrong # args should be: hulltype ", - "<hullTypeName>", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_WIDGET) { - hullTypeName = Tcl_GetString(objv[1]); - if (iclsPtr->hullTypePtr != NULL) { - Tcl_AppendResult(interp, "too many hulltype statements", NULL); - return TCL_ERROR; - } - correctArg = 0; - if (strcmp(hullTypeName, "frame") == 0) { - iclsPtr->flags |= ITCL_WIDGET_FRAME; - correctArg = 1; - } - if (strcmp(hullTypeName, "labelframe") == 0) { - iclsPtr->flags |= ITCL_WIDGET_LABEL_FRAME; - correctArg = 1; - } - if (strcmp(hullTypeName, "toplevel") == 0) { - iclsPtr->flags |= ITCL_WIDGET_TOPLEVEL; - correctArg = 1; - } - if (strcmp(hullTypeName, "ttk::frame") == 0) { - iclsPtr->flags |= ITCL_WIDGET_TTK_FRAME; - correctArg = 1; - } - if (strcmp(hullTypeName, "ttk::labelframe") == 0) { - iclsPtr->flags |= ITCL_WIDGET_TTK_LABEL_FRAME; - correctArg = 1; - } - if (strcmp(hullTypeName, "ttk::toplevel") == 0) { - iclsPtr->flags |= ITCL_WIDGET_TTK_TOPLEVEL; - correctArg = 1; - } - if (!correctArg) { - Tcl_AppendResult(interp, - "syntax: must be hulltype frame|toplevel|labelframe|", - "ttk::frame|ttk::toplevel|ttk::labelframe", NULL); - return TCL_ERROR; - } - iclsPtr->hullTypePtr = Tcl_NewStringObj(hullTypeName, -1); - Tcl_IncrRefCount(iclsPtr->hullTypePtr); - return TCL_OK; - } - Tcl_AppendResult(interp, "invalid command name \"hulltype\"", NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassWidgetClassCmd() - * - * Used to set a widgetclass for a widget - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ClassWidgetClassCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - const char *widgetClassName; - - infoPtr = (ItclObjectInfo *)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - ItclShowArgs(1, "Itcl_ClassWidgetClassCmd", objc-1, objv); - if (iclsPtr->flags & ITCL_TYPE) { - Tcl_AppendResult(interp, "can't set widgetclass for ::itcl::type", - NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - Tcl_AppendResult(interp, "can't set widgetclass for ", - "::itcl::widgetadaptor", NULL); - return TCL_ERROR; - } - if (objc != 2) { - Tcl_AppendResult(interp, "wrong # args should be: widgetclass ", - "<widgetClassName>", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_WIDGET) { - widgetClassName = Tcl_GetString(objv[1]); - if (!isupper(UCHAR(*widgetClassName))) { - Tcl_AppendResult(interp, "widgetclass \"", widgetClassName, - "\" does not begin with an uppercase letter", NULL); - return TCL_ERROR; - } - if (iclsPtr->widgetClassPtr != NULL) { - Tcl_AppendResult(interp, "too many widgetclass statements", NULL); - return TCL_ERROR; - } - iclsPtr->widgetClassPtr = Tcl_NewStringObj(widgetClassName, -1); - Tcl_IncrRefCount(iclsPtr->widgetClassPtr); - return TCL_OK; - } - Tcl_AppendResult(interp, "invalid command name \"widgetclass\"", NULL); - return TCL_ERROR; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclDecls.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclDecls.h deleted file mode 100644 index 4af4200..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclDecls.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * This file is (mostly) automatically generated from itcl.decls. - */ - -#ifndef _ITCLDECLS -#define _ITCLDECLS - -#if defined(USE_ITCL_STUBS) - -ITCLAPI const char *Itcl_InitStubs( - Tcl_Interp *, const char *version, int exact); -#else - -#define Itcl_InitStubs(interp, version, exact) Tcl_PkgRequire(interp,"itcl",version,exact) - -#endif - - -/* !BEGIN!: Do not edit below this line. */ - -#define ITCL_STUBS_EPOCH 0 -#define ITCL_STUBS_REVISION 150 - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Exported function declarations: - */ - -/* Slot 0 is reserved */ -/* Slot 1 is reserved */ -/* 2 */ -ITCLAPI int Itcl_RegisterC(Tcl_Interp *interp, const char *name, - Tcl_CmdProc *proc, ClientData clientData, - Tcl_CmdDeleteProc *deleteProc); -/* 3 */ -ITCLAPI int Itcl_RegisterObjC(Tcl_Interp *interp, - const char *name, Tcl_ObjCmdProc *proc, - ClientData clientData, - Tcl_CmdDeleteProc *deleteProc); -/* 4 */ -ITCLAPI int Itcl_FindC(Tcl_Interp *interp, const char *name, - Tcl_CmdProc **argProcPtr, - Tcl_ObjCmdProc **objProcPtr, - ClientData *cDataPtr); -/* 5 */ -ITCLAPI void Itcl_InitStack(Itcl_Stack *stack); -/* 6 */ -ITCLAPI void Itcl_DeleteStack(Itcl_Stack *stack); -/* 7 */ -ITCLAPI void Itcl_PushStack(ClientData cdata, Itcl_Stack *stack); -/* 8 */ -ITCLAPI ClientData Itcl_PopStack(Itcl_Stack *stack); -/* 9 */ -ITCLAPI ClientData Itcl_PeekStack(Itcl_Stack *stack); -/* 10 */ -ITCLAPI ClientData Itcl_GetStackValue(Itcl_Stack *stack, int pos); -/* 11 */ -ITCLAPI void Itcl_InitList(Itcl_List *listPtr); -/* 12 */ -ITCLAPI void Itcl_DeleteList(Itcl_List *listPtr); -/* 13 */ -ITCLAPI Itcl_ListElem * Itcl_CreateListElem(Itcl_List *listPtr); -/* 14 */ -ITCLAPI Itcl_ListElem * Itcl_DeleteListElem(Itcl_ListElem *elemPtr); -/* 15 */ -ITCLAPI Itcl_ListElem * Itcl_InsertList(Itcl_List *listPtr, ClientData val); -/* 16 */ -ITCLAPI Itcl_ListElem * Itcl_InsertListElem(Itcl_ListElem *pos, - ClientData val); -/* 17 */ -ITCLAPI Itcl_ListElem * Itcl_AppendList(Itcl_List *listPtr, ClientData val); -/* 18 */ -ITCLAPI Itcl_ListElem * Itcl_AppendListElem(Itcl_ListElem *pos, - ClientData val); -/* 19 */ -ITCLAPI void Itcl_SetListValue(Itcl_ListElem *elemPtr, - ClientData val); -/* 20 */ -ITCLAPI void Itcl_EventuallyFree(ClientData cdata, - Tcl_FreeProc *fproc); -/* 21 */ -ITCLAPI void Itcl_PreserveData(ClientData cdata); -/* 22 */ -ITCLAPI void Itcl_ReleaseData(ClientData cdata); -/* 23 */ -ITCLAPI Itcl_InterpState Itcl_SaveInterpState(Tcl_Interp *interp, int status); -/* 24 */ -ITCLAPI int Itcl_RestoreInterpState(Tcl_Interp *interp, - Itcl_InterpState state); -/* 25 */ -ITCLAPI void Itcl_DiscardInterpState(Itcl_InterpState state); - -typedef struct { - const struct ItclIntStubs *itclIntStubs; -} ItclStubHooks; - -typedef struct ItclStubs { - int magic; - int epoch; - int revision; - const ItclStubHooks *hooks; - - void (*reserved0)(void); - void (*reserved1)(void); - int (*itcl_RegisterC) (Tcl_Interp *interp, const char *name, Tcl_CmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 2 */ - int (*itcl_RegisterObjC) (Tcl_Interp *interp, const char *name, Tcl_ObjCmdProc *proc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 3 */ - int (*itcl_FindC) (Tcl_Interp *interp, const char *name, Tcl_CmdProc **argProcPtr, Tcl_ObjCmdProc **objProcPtr, ClientData *cDataPtr); /* 4 */ - void (*itcl_InitStack) (Itcl_Stack *stack); /* 5 */ - void (*itcl_DeleteStack) (Itcl_Stack *stack); /* 6 */ - void (*itcl_PushStack) (ClientData cdata, Itcl_Stack *stack); /* 7 */ - ClientData (*itcl_PopStack) (Itcl_Stack *stack); /* 8 */ - ClientData (*itcl_PeekStack) (Itcl_Stack *stack); /* 9 */ - ClientData (*itcl_GetStackValue) (Itcl_Stack *stack, int pos); /* 10 */ - void (*itcl_InitList) (Itcl_List *listPtr); /* 11 */ - void (*itcl_DeleteList) (Itcl_List *listPtr); /* 12 */ - Itcl_ListElem * (*itcl_CreateListElem) (Itcl_List *listPtr); /* 13 */ - Itcl_ListElem * (*itcl_DeleteListElem) (Itcl_ListElem *elemPtr); /* 14 */ - Itcl_ListElem * (*itcl_InsertList) (Itcl_List *listPtr, ClientData val); /* 15 */ - Itcl_ListElem * (*itcl_InsertListElem) (Itcl_ListElem *pos, ClientData val); /* 16 */ - Itcl_ListElem * (*itcl_AppendList) (Itcl_List *listPtr, ClientData val); /* 17 */ - Itcl_ListElem * (*itcl_AppendListElem) (Itcl_ListElem *pos, ClientData val); /* 18 */ - void (*itcl_SetListValue) (Itcl_ListElem *elemPtr, ClientData val); /* 19 */ - void (*itcl_EventuallyFree) (ClientData cdata, Tcl_FreeProc *fproc); /* 20 */ - void (*itcl_PreserveData) (ClientData cdata); /* 21 */ - void (*itcl_ReleaseData) (ClientData cdata); /* 22 */ - Itcl_InterpState (*itcl_SaveInterpState) (Tcl_Interp *interp, int status); /* 23 */ - int (*itcl_RestoreInterpState) (Tcl_Interp *interp, Itcl_InterpState state); /* 24 */ - void (*itcl_DiscardInterpState) (Itcl_InterpState state); /* 25 */ -} ItclStubs; - -extern const ItclStubs *itclStubsPtr; - -#ifdef __cplusplus -} -#endif - -#if defined(USE_ITCL_STUBS) - -/* - * Inline function declarations: - */ - -/* Slot 0 is reserved */ -/* Slot 1 is reserved */ -#define Itcl_RegisterC \ - (itclStubsPtr->itcl_RegisterC) /* 2 */ -#define Itcl_RegisterObjC \ - (itclStubsPtr->itcl_RegisterObjC) /* 3 */ -#define Itcl_FindC \ - (itclStubsPtr->itcl_FindC) /* 4 */ -#define Itcl_InitStack \ - (itclStubsPtr->itcl_InitStack) /* 5 */ -#define Itcl_DeleteStack \ - (itclStubsPtr->itcl_DeleteStack) /* 6 */ -#define Itcl_PushStack \ - (itclStubsPtr->itcl_PushStack) /* 7 */ -#define Itcl_PopStack \ - (itclStubsPtr->itcl_PopStack) /* 8 */ -#define Itcl_PeekStack \ - (itclStubsPtr->itcl_PeekStack) /* 9 */ -#define Itcl_GetStackValue \ - (itclStubsPtr->itcl_GetStackValue) /* 10 */ -#define Itcl_InitList \ - (itclStubsPtr->itcl_InitList) /* 11 */ -#define Itcl_DeleteList \ - (itclStubsPtr->itcl_DeleteList) /* 12 */ -#define Itcl_CreateListElem \ - (itclStubsPtr->itcl_CreateListElem) /* 13 */ -#define Itcl_DeleteListElem \ - (itclStubsPtr->itcl_DeleteListElem) /* 14 */ -#define Itcl_InsertList \ - (itclStubsPtr->itcl_InsertList) /* 15 */ -#define Itcl_InsertListElem \ - (itclStubsPtr->itcl_InsertListElem) /* 16 */ -#define Itcl_AppendList \ - (itclStubsPtr->itcl_AppendList) /* 17 */ -#define Itcl_AppendListElem \ - (itclStubsPtr->itcl_AppendListElem) /* 18 */ -#define Itcl_SetListValue \ - (itclStubsPtr->itcl_SetListValue) /* 19 */ -#define Itcl_EventuallyFree \ - (itclStubsPtr->itcl_EventuallyFree) /* 20 */ -#define Itcl_PreserveData \ - (itclStubsPtr->itcl_PreserveData) /* 21 */ -#define Itcl_ReleaseData \ - (itclStubsPtr->itcl_ReleaseData) /* 22 */ -#define Itcl_SaveInterpState \ - (itclStubsPtr->itcl_SaveInterpState) /* 23 */ -#define Itcl_RestoreInterpState \ - (itclStubsPtr->itcl_RestoreInterpState) /* 24 */ -#define Itcl_DiscardInterpState \ - (itclStubsPtr->itcl_DiscardInterpState) /* 25 */ - -#endif /* defined(USE_ITCL_STUBS) */ - -/* !END!: Do not edit above this line. */ - -#endif /* _ITCLDECLS */ diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclEnsemble.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclEnsemble.c deleted file mode 100644 index 1d5ac19..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclEnsemble.c +++ /dev/null @@ -1,2243 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This part handles ensembles, which support compound commands in Tcl. - * The usual "info" command is an ensemble with parts like "info body" - * and "info globals". Extension developers can extend commands like - * "info" by adding their own parts to the ensemble. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -#define ITCL_ENSEMBLE_CUSTOM 0x01 -#define ITCL_ENSEMBLE_ENSEMBLE 0x02 - -/* - * Data used to represent an ensemble: - */ -struct Ensemble; -typedef struct EnsemblePart { - char *name; /* name of this part */ - Tcl_Obj *namePtr; - Tcl_Command cmdPtr; /* command handling this part */ - char *usage; /* usage string describing syntax */ - struct Ensemble* ensemble; /* ensemble containing this part */ - ItclArgList *arglistPtr; /* the parsed argument list */ - Tcl_ObjCmdProc *objProc; /* handling procedure for part */ - ClientData *clientData; /* the procPtr for the part */ - Tcl_CmdDeleteProc *deleteProc; - /* procedure used to destroy client data */ - int minChars; /* chars needed to uniquely identify part */ - int flags; - Tcl_Interp *interp; - Tcl_Obj *mapNamePtr; - Tcl_Obj *subEnsemblePtr; - Tcl_Obj *newMapDict; -} EnsemblePart; - -#define ENSEMBLE_DELETE_STARTED 0x1 -#define ENSEMBLE_PART_DELETE_STARTED 0x2 - -/* - * Data used to represent an ensemble: - */ -typedef struct Ensemble { - Tcl_Interp *interp; /* interpreter containing this ensemble */ - EnsemblePart **parts; /* list of parts in this ensemble */ - int numParts; /* number of parts in part list */ - int maxParts; /* current size of parts list */ - int ensembleId; /* this ensembles id */ - Tcl_Command cmdPtr; /* command representing this ensemble */ - EnsemblePart* parent; /* parent part for sub-ensembles - * NULL => toplevel ensemble */ - Tcl_Namespace *nsPtr; /* namespace for ensemble part commands */ - int flags; - Tcl_Obj *namePtr; -} Ensemble; - -/* - * Data shared by ensemble access commands and ensemble parser: - */ -typedef struct EnsembleParser { - Tcl_Interp* master; /* master interp containing ensembles */ - Tcl_Interp* parser; /* slave interp for parsing */ - Ensemble* ensData; /* add parts to this ensemble */ -} EnsembleParser; - -static int EnsembleSubCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); -static int EnsembleUnknownCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); - -/* - * Forward declarations for the procedures used in this file. - */ -static void GetEnsembleUsage (Tcl_Interp *interp, - Ensemble *ensData, Tcl_Obj *objPtr); -static void GetEnsemblePartUsage (Tcl_Interp *interp, - Ensemble *ensData, EnsemblePart *ensPart, Tcl_Obj *objPtr); -static int CreateEnsemble (Tcl_Interp *interp, - Ensemble *parentEnsData, const char *ensName); -static int AddEnsemblePart (Tcl_Interp *interp, - Ensemble* ensData, const char* partName, const char* usageInfo, - Tcl_ObjCmdProc *objProc, ClientData clientData, - Tcl_CmdDeleteProc *deleteProc, int flags, EnsemblePart **rVal); -static int FindEnsemble (Tcl_Interp *interp, const char **nameArgv, - int nameArgc, Ensemble** ensDataPtr); -static int CreateEnsemblePart (Tcl_Interp *interp, - Ensemble *ensData, const char* partName, EnsemblePart **ensPartPtr); -static void DeleteEnsemblePart (ClientData clientData); -static int FindEnsemblePart (Tcl_Interp *interp, - Ensemble *ensData, const char* partName, EnsemblePart **rensPart); -static void DeleteEnsemble(ClientData clientData); -static int FindEnsemblePartIndex (Ensemble *ensData, - const char *partName, int *posPtr); -static void ComputeMinChars (Ensemble *ensData, int pos); -static EnsembleParser* GetEnsembleParser (Tcl_Interp *interp); -static void DeleteEnsParser (ClientData clientData, Tcl_Interp* interp); - - -/* - *---------------------------------------------------------------------- - * - * Itcl_EnsembleInit -- - * - * Called when any interpreter is created to make sure that - * things are properly set up for ensembles. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything goes - * wrong. - * - * Side effects: - * On the first call, the "ensemble" object type is registered - * with the Tcl compiler. If an error is encountered, an error - * is left as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ - /* ARGSUSED */ -int -Itcl_EnsembleInit( - Tcl_Interp *interp) /* interpreter being initialized */ -{ - Tcl_DString buffer; - Tcl_InterpDeleteProc *procPtr; - ItclObjectInfo *infoPtr; - - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - Tcl_CreateObjCommand(interp, "::itcl::ensemble", - Itcl_EnsembleCmd, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_COMMANDS_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, "::ensembles", -1); - infoPtr->ensembleInfo->ensembleNsPtr = Tcl_CreateNamespace(interp, - Tcl_DStringValue(&buffer), NULL, NULL); - Tcl_DStringFree(&buffer); - if (infoPtr->ensembleInfo->ensembleNsPtr == NULL) { - Tcl_AppendResult(interp, "error in creating namespace: ", - Tcl_DStringValue(&buffer), NULL); - return TCL_ERROR; - } - Tcl_CreateObjCommand(interp, - ITCL_COMMANDS_NAMESPACE "::ensembles::unknown", - EnsembleUnknownCmd, NULL, NULL); - return TCL_OK; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_CreateEnsemble -- - * - * Creates an ensemble command, or adds a sub-ensemble to an - * existing ensemble command. The ensemble name is a space- - * separated list. The first word in the list is the command - * name for the top-level ensemble. Other names do not have - * commands associated with them; they are merely sub-ensembles - * within the ensemble. So a name like "a::b::foo bar baz" - * represents an ensemble command called "foo" in the namespace - * "a::b" that has a sub-ensemble "bar", that has a sub-ensemble - * "baz". - * - * If the name is a single word, then this procedure creates - * a top-level ensemble and installs an access command for it. - * If a command already exists with that name, it is deleted. - * - * If the name has more than one word, then the leading words - * are treated as a path name for an existing ensemble. The - * last word is treated as the name for a new sub-ensemble. - * If an part already exists with that name, it is an error. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything goes - * wrong. - * - * Side effects: - * If an error is encountered, an error is left as the result - * in the interpreter. - * - *---------------------------------------------------------------------- - */ -int -Itcl_CreateEnsemble( - Tcl_Interp *interp, /* interpreter to be updated */ - const char* ensName) /* name of the new ensemble */ -{ - const char **nameArgv = NULL; - int nameArgc; - Ensemble *parentEnsData; - - /* - * Split the ensemble name into its path components. - */ - if (Tcl_SplitList(interp, (const char *)ensName, &nameArgc, - &nameArgv) != TCL_OK) { - goto ensCreateFail; - } - if (nameArgc < 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid ensemble name \"", ensName, "\"", - (char*)NULL); - goto ensCreateFail; - } - - /* - * If there is more than one path component, then follow - * the path down to the last component, to find the containing - * ensemble. - */ - parentEnsData = NULL; - if (nameArgc > 1) { - if (FindEnsemble(interp, nameArgv, nameArgc-1, &parentEnsData) - != TCL_OK) { - goto ensCreateFail; - } - - if (parentEnsData == NULL) { - char *pname = Tcl_Merge(nameArgc-1, nameArgv); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid ensemble name \"", pname, "\"", - (char*)NULL); - ckfree(pname); - goto ensCreateFail; - } - } - - /* - * Create the ensemble. - */ - if (CreateEnsemble(interp, parentEnsData, nameArgv[nameArgc-1]) - != TCL_OK) { - goto ensCreateFail; - } - - ckfree((char*)nameArgv); - return TCL_OK; - -ensCreateFail: - if (nameArgv) { - ckfree((char*)nameArgv); - } - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while creating ensemble \"%s\")", - ensName)); - - return TCL_ERROR; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_AddEnsemblePart -- - * - * Adds a part to an ensemble which has been created by - * Itcl_CreateEnsemble. Ensembles are addressed by name, as - * described in Itcl_CreateEnsemble. - * - * If the ensemble already has a part with the specified name, - * this procedure returns an error. Otherwise, it adds a new - * part to the ensemble. - * - * Any client data specified is automatically passed to the - * handling procedure whenever the part is invoked. It is - * automatically destroyed by the deleteProc when the part is - * deleted. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything goes - * wrong. - * - * Side effects: - * If an error is encountered, an error is left as the result - * in the interpreter. - * - *---------------------------------------------------------------------- - */ -int -Itcl_AddEnsemblePart( - Tcl_Interp *interp, /* interpreter to be updated */ - const char* ensName, /* ensemble containing this part */ - const char* partName, /* name of the new part */ - const char* usageInfo, /* usage info for argument list */ - Tcl_ObjCmdProc *objProc, /* handling procedure for part */ - ClientData clientData, /* client data associated with part */ - Tcl_CmdDeleteProc *deleteProc) /* procedure used to destroy client data */ -{ - const char **nameArgv = NULL; - int nameArgc; - Ensemble *ensData; - EnsemblePart *ensPart; - - /* - * Parse the ensemble name and look for a containing ensemble. - */ - if (Tcl_SplitList(interp, (const char *)ensName, &nameArgc, - &nameArgv) != TCL_OK) { - goto ensPartFail; - } - if (FindEnsemble(interp, nameArgv, nameArgc, &ensData) != TCL_OK) { - goto ensPartFail; - } - - if (ensData == NULL) { - char *pname = Tcl_Merge(nameArgc, nameArgv); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid ensemble name \"", pname, "\"", - (char*)NULL); - ckfree(pname); - goto ensPartFail; - } - - /* - * Install the new part into the part list. - */ - if (AddEnsemblePart(interp, ensData, partName, usageInfo, - objProc, clientData, deleteProc, ITCL_ENSEMBLE_CUSTOM, - &ensPart) != TCL_OK) { - goto ensPartFail; - } - - ckfree((char*)nameArgv); - return TCL_OK; - -ensPartFail: - if (nameArgv) { - ckfree((char*)nameArgv); - } - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while adding to ensemble \"%s\")", - ensName)); - - return TCL_ERROR; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_GetEnsemblePart -- - * - * Looks for a part within an ensemble, and returns information - * about it. - * - * Results: - * If the ensemble and its part are found, this procedure - * loads information about the part into the "infoPtr" structure - * and returns 1. Otherwise, it returns 0. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -int -Itcl_GetEnsemblePart( - Tcl_Interp *interp, /* interpreter to be updated */ - const char *ensName, /* ensemble containing the part */ - const char *partName, /* name of the desired part */ - Tcl_CmdInfo *infoPtr) /* returns: info associated with part */ -{ - const char **nameArgv = NULL; - int nameArgc; - Ensemble *ensData; - EnsemblePart *ensPart; - Itcl_InterpState state; - - /* - * Parse the ensemble name and look for a containing ensemble. - * Save the interpreter state before we do this. If we get any - * errors, we don't want them to affect the interpreter. - */ - state = Itcl_SaveInterpState(interp, TCL_OK); - - if (Tcl_SplitList(interp, (const char *)ensName, &nameArgc, - &nameArgv) != TCL_OK) { - goto ensGetFail; - } - if (FindEnsemble(interp, nameArgv, nameArgc, &ensData) != TCL_OK) { - goto ensGetFail; - } - if (ensData == NULL) { - goto ensGetFail; - } - - /* - * Look for a part with the desired name. If found, load - * its data into the "infoPtr" structure. - */ - if (FindEnsemblePart(interp, ensData, partName, &ensPart) - != TCL_OK || ensPart == NULL) { - goto ensGetFail; - } - - if (Tcl_GetCommandInfoFromToken(ensPart->cmdPtr, infoPtr) != 1) { - goto ensGetFail; - } - - Itcl_DiscardInterpState(state); - ckfree((char *)nameArgv); - return 1; - -ensGetFail: - if (nameArgv) { - ckfree((char *)nameArgv); - } - Itcl_RestoreInterpState(interp, state); - return 0; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_IsEnsemble -- - * - * Determines whether or not an existing command is an ensemble. - * - * Results: - * Returns non-zero if the command is an ensemble, and zero - * otherwise. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -int -Itcl_IsEnsemble( - Tcl_CmdInfo* infoPtr) /* command info from Tcl_GetCommandInfo() */ -{ - if (infoPtr) { -/* FIXME use CMD and Tcl_IsEnsemble!! */ - return (infoPtr->deleteProc == DeleteEnsemble); - } - return 0; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_GetEnsembleUsage -- - * - * Returns a summary of all of the parts of an ensemble and - * the meaning of their arguments. Each part is listed on - * a separate line. Having this summary is sometimes useful - * when building error messages for the "@error" handler in - * an ensemble. - * - * Ensembles are accessed by name, as described in - * Itcl_CreateEnsemble. - * - * Results: - * If the ensemble is found, its usage information is appended - * onto the object "objPtr", and this procedure returns - * non-zero. It is the responsibility of the caller to - * initialize and free the object. If anything goes wrong, - * this procedure returns 0. - * - * Side effects: - * Object passed in is modified. - * - *---------------------------------------------------------------------- - */ -int -Itcl_GetEnsembleUsage( - Tcl_Interp *interp, /* interpreter containing the ensemble */ - const char *ensName, /* name of the ensemble */ - Tcl_Obj *objPtr) /* returns: summary of usage info */ -{ - const char **nameArgv = NULL; - int nameArgc; - Ensemble *ensData; - Itcl_InterpState state; - - /* - * Parse the ensemble name and look for the ensemble. - * Save the interpreter state before we do this. If we get - * any errors, we don't want them to affect the interpreter. - */ - state = Itcl_SaveInterpState(interp, TCL_OK); - - if (Tcl_SplitList(interp, (const char *)ensName, &nameArgc, - &nameArgv) != TCL_OK) { - goto ensUsageFail; - } - if (FindEnsemble(interp, nameArgv, nameArgc, &ensData) != TCL_OK) { - goto ensUsageFail; - } - if (ensData == NULL) { - goto ensUsageFail; - } - - /* - * Add a summary of usage information to the return buffer. - */ - GetEnsembleUsage(interp, ensData, objPtr); - - Itcl_DiscardInterpState(state); - ckfree((char *)nameArgv); - return 1; - -ensUsageFail: - if (nameArgv) { - ckfree((char *)nameArgv); - } - Itcl_RestoreInterpState(interp, state); - return 0; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_GetEnsembleUsageForObj -- - * - * Returns a summary of all of the parts of an ensemble and - * the meaning of their arguments. This procedure is just - * like Itcl_GetEnsembleUsage, but it determines the desired - * ensemble from a command line argument. The argument should - * be the first argument on the command line--the ensemble - * command or one of its parts. - * - * Results: - * If the ensemble is found, its usage information is appended - * onto the object "objPtr", and this procedure returns - * non-zero. It is the responsibility of the caller to - * initialize and free the object. If anything goes wrong, - * this procedure returns 0. - * - * Side effects: - * Object passed in is modified. - * - *---------------------------------------------------------------------- - */ -int -Itcl_GetEnsembleUsageForObj( - Tcl_Interp *interp, /* interpreter containing the ensemble */ - Tcl_Obj *ensObjPtr, /* argument representing ensemble */ - Tcl_Obj *objPtr) /* returns: summary of usage info */ -{ - Ensemble *ensData; - Tcl_Obj *chainObj; - Tcl_Command cmd; - Tcl_CmdInfo infoPtr; - - /* - * If the argument is an ensemble part, then follow the chain - * back to the command word for the entire ensemble. - */ - chainObj = ensObjPtr; - - if (chainObj) { - cmd = Tcl_GetCommandFromObj(interp, chainObj); - if (Tcl_GetCommandInfoFromToken(cmd, &infoPtr) != 1) { - return 0; - } - if (infoPtr.deleteProc == DeleteEnsemble) { - ensData = (Ensemble*)infoPtr.objClientData; - GetEnsembleUsage(interp, ensData, objPtr); - return 1; - } - } - return 0; -} - - -/* - *---------------------------------------------------------------------- - * - * GetEnsembleUsage -- - * - * - * Returns a summary of all of the parts of an ensemble and - * the meaning of their arguments. Each part is listed on - * a separate line. This procedure is used internally to - * generate usage information for error messages. - * - * Results: - * Appends usage information onto the object in "objPtr". - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -static void -GetEnsembleUsage( - Tcl_Interp *interp, - Ensemble *ensData, /* ensemble data */ - Tcl_Obj *objPtr) /* returns: summary of usage info */ -{ - const char *spaces = " "; - int isOpenEnded = 0; - - int i; - EnsemblePart *ensPart; - - for (i=0; i < ensData->numParts; i++) { - ensPart = ensData->parts[i]; - - if ((*ensPart->name == '@') && (strcmp(ensPart->name,"@error") == 0)) { - isOpenEnded = 1; - } else { - if ((*ensPart->name == '@') && - (strcmp(ensPart->name,"@itcl-builtin_info") == 0)) { - /* the builtin info command is not reported in [incr tcl] */ - continue; - } - Tcl_AppendToObj(objPtr, spaces, -1); - GetEnsemblePartUsage(interp, ensData, ensPart, objPtr); - spaces = "\n "; - } - } - if (isOpenEnded) { - Tcl_AppendToObj(objPtr, - "\n...and others described on the man page", -1); - } -} - - -/* - *---------------------------------------------------------------------- - * - * GetEnsemblePartUsage -- - * - * Determines the usage for a single part within an ensemble, - * and appends a summary onto a dynamic string. The usage - * is a combination of the part name and the argument summary. - * It is the caller's responsibility to initialize and free - * the dynamic string. - * - * Results: - * Returns usage information in the object "objPtr". - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -static void -GetEnsemblePartUsage( - Tcl_Interp *interp, - Ensemble *ensData, - EnsemblePart *ensPart, /* ensemble part for usage info */ - Tcl_Obj *objPtr) /* returns: usage information */ -{ - EnsemblePart *part; - Tcl_Command cmdPtr; - const char *name; - Itcl_List trail; - Itcl_ListElem *elem; - Tcl_DString buffer; - - /* - * Build the trail of ensemble names leading to this part. - */ - Tcl_DStringInit(&buffer); - Itcl_InitList(&trail); - for (part=ensPart; part; part=part->ensemble->parent) { - Itcl_InsertList(&trail, (ClientData)part); - } - - while (ensData->parent != NULL) { - ensData = ensData->parent->ensemble; - } - cmdPtr = ensData->cmdPtr; - name = Tcl_GetCommandName(interp, cmdPtr); - Tcl_DStringAppendElement(&buffer, name); - - for (elem=Itcl_FirstListElem(&trail); elem; elem=Itcl_NextListElem(elem)) { - part = (EnsemblePart*)Itcl_GetListValue(elem); - Tcl_DStringAppendElement(&buffer, part->name); - } - Itcl_DeleteList(&trail); - - /* - * If the part has usage info, use it directly. - */ - if (ensPart->usage && *ensPart->usage != '\0') { - Tcl_DStringAppend(&buffer, " ", 1); - Tcl_DStringAppend(&buffer, ensPart->usage, -1); - } else { - - /* - * If the part is itself an ensemble, summarize its usage. - */ - if (ensPart->cmdPtr != NULL) { - if (Tcl_IsEnsemble(ensPart->cmdPtr)) { - Tcl_DStringAppend(&buffer, " option ?arg arg ...?", 21); - } - } - } - - Tcl_AppendToObj(objPtr, Tcl_DStringValue(&buffer), - Tcl_DStringLength(&buffer)); - - Tcl_DStringFree(&buffer); -} - - -/* - *---------------------------------------------------------------------- - * - * CreateEnsemble -- - * - * Creates an ensemble command, or adds a sub-ensemble to an - * existing ensemble command. Works like Itcl_CreateEnsemble, - * except that the ensemble name is a single name, not a path. - * If a parent ensemble is specified, then a new ensemble is - * added to that parent. If a part already exists with the - * same name, it is an error. If a parent ensemble is not - * specified, then a top-level ensemble is created. If a - * command already exists with the same name, it is deleted. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything goes - * wrong. - * - * Side effects: - * If an error is encountered, an error is left as the result - * in the interpreter. - * - *---------------------------------------------------------------------- - */ -static int -CreateEnsemble( - Tcl_Interp *interp, /* interpreter to be updated */ - Ensemble *parentEnsData, /* parent ensemble or NULL */ - const char *ensName) /* name of the new ensemble */ -{ - Tcl_Obj *objPtr; - Tcl_DString buffer; - Tcl_HashEntry *hPtr; - Tcl_InterpDeleteProc *procPtr; - Tcl_Obj *mapDict; - Tcl_Obj *toObjPtr; - ItclObjectInfo *infoPtr; - Ensemble *ensData; - EnsemblePart *ensPart; - int result; - int isNew; - char buf[20]; - Tcl_Obj *unkObjPtr; - - /* - * Create the data associated with the ensemble. - */ - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - infoPtr->ensembleInfo->numEnsembles++; - ensData = (Ensemble*)ckalloc(sizeof(Ensemble)); - memset(ensData, 0, sizeof(Ensemble)); - ensData->namePtr = Tcl_NewStringObj(ensName, -1); - Tcl_IncrRefCount(ensData->namePtr); - ensData->interp = interp; - ensData->numParts = 0; - ensData->maxParts = 10; - ensData->ensembleId = infoPtr->ensembleInfo->numEnsembles; - ensData->parts = (EnsemblePart**)ckalloc( - (unsigned)(ensData->maxParts*sizeof(EnsemblePart*)) - ); - memset(ensData->parts, 0, ensData->maxParts*sizeof(EnsemblePart*)); - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_COMMANDS_NAMESPACE "::ensembles::", -1); - sprintf(buf, "%d", ensData->ensembleId); - Tcl_DStringAppend(&buffer, buf, -1); - ensData->nsPtr = Tcl_CreateNamespace(interp, Tcl_DStringValue(&buffer), - ensData, DeleteEnsemble); - if (ensData->nsPtr == NULL) { - Tcl_AppendResult(interp, "error in creating namespace: ", - Tcl_DStringValue(&buffer), NULL); - result = TCL_ERROR; - goto finish; - } - - /* - * If there is no parent data, then this is a top-level - * ensemble. Create the ensemble by installing its access - * command. - */ - if (parentEnsData == NULL) { - Tcl_Obj *unkObjPtr; - ensData->cmdPtr = Tcl_CreateEnsemble(interp, ensName, - Tcl_GetCurrentNamespace(interp), TCL_ENSEMBLE_PREFIX); - hPtr = Tcl_CreateHashEntry(&infoPtr->ensembleInfo->ensembles, - (char *)ensData->cmdPtr, &isNew); - if (!isNew) { - result = TCL_ERROR; - goto finish; - } - Tcl_SetHashValue(hPtr, (ClientData)ensData); - unkObjPtr = Tcl_NewStringObj(ITCL_COMMANDS_NAMESPACE, -1); - Tcl_AppendToObj(unkObjPtr, "::ensembles::unknown", -1); - if (Tcl_SetEnsembleUnknownHandler(NULL, ensData->cmdPtr, - unkObjPtr) != TCL_OK) { - Tcl_DecrRefCount(unkObjPtr); - result = TCL_ERROR; - goto finish; - } - - Tcl_SetResult(interp, Tcl_DStringValue(&buffer), TCL_VOLATILE); - result = TCL_OK; - goto finish; - } - - /* - * Otherwise, this ensemble is contained within another parent. - * Install the new ensemble as a part within its parent. - */ - if (CreateEnsemblePart(interp, parentEnsData, ensName, &ensPart) - != TCL_OK) { - DeleteEnsemble((ClientData)ensData); - result = TCL_ERROR; - goto finish; - } - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, infoPtr->ensembleInfo->ensembleNsPtr->fullName, -1); - Tcl_DStringAppend(&buffer, "::subensembles::", -1); - sprintf(buf, "%d", parentEnsData->ensembleId); - Tcl_DStringAppend(&buffer, buf, -1); - Tcl_DStringAppend(&buffer, "::", 2); - Tcl_DStringAppend(&buffer, ensName, -1); - objPtr = Tcl_NewStringObj(Tcl_DStringValue(&buffer), -1); - hPtr = Tcl_CreateHashEntry(&infoPtr->ensembleInfo->subEnsembles, - (char *)objPtr, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr, ensData); - } - - ensPart->subEnsemblePtr = objPtr; - Tcl_IncrRefCount(ensPart->subEnsemblePtr); - ensPart->cmdPtr = Tcl_CreateEnsemble(interp, Tcl_DStringValue(&buffer), - Tcl_GetCurrentNamespace(interp), TCL_ENSEMBLE_PREFIX); - hPtr = Tcl_CreateHashEntry(&infoPtr->ensembleInfo->ensembles, - (char *)ensPart->cmdPtr, &isNew); - if (!isNew) { - result = TCL_ERROR; - goto finish; - } - Tcl_SetHashValue(hPtr, (ClientData)ensData); - unkObjPtr = Tcl_NewStringObj(ITCL_COMMANDS_NAMESPACE, -1); - Tcl_AppendToObj(unkObjPtr, "::ensembles::unknown", -1); - if (Tcl_SetEnsembleUnknownHandler(NULL, ensPart->cmdPtr, - unkObjPtr) != TCL_OK) { - result = TCL_ERROR; - goto finish; - } - - Tcl_GetEnsembleMappingDict(NULL, parentEnsData->cmdPtr, &mapDict); - if (mapDict == NULL) { - mapDict = Tcl_NewObj(); - } - toObjPtr = Tcl_NewStringObj(Tcl_DStringValue(&buffer), -1); - Tcl_DictObjPut(NULL, mapDict, ensData->namePtr, toObjPtr); - Tcl_SetEnsembleMappingDict(NULL, parentEnsData->cmdPtr, mapDict); - ensData->cmdPtr = ensPart->cmdPtr; - ensData->parent = ensPart; - result = TCL_OK; - -finish: - Tcl_DStringFree(&buffer); - return result; -} - - -/* - *---------------------------------------------------------------------- - * - * AddEnsemblePart -- - * - * Adds a part to an existing ensemble. Works like - * Itcl_AddEnsemblePart, but the part name is a single word, - * not a path. - * - * If the ensemble already has a part with the specified name, - * this procedure returns an error. Otherwise, it adds a new - * part to the ensemble. - * - * Any client data specified is automatically passed to the - * handling procedure whenever the part is invoked. It is - * automatically destroyed by the deleteProc when the part is - * deleted. - * - * Results: - * Returns TCL_OK if successful, along with a pointer to the - * new part. Returns TCL_ERROR if anything goes wrong. - * - * Side effects: - * If an error is encountered, an error is left as the result - * in the interpreter. - * - *---------------------------------------------------------------------- - */ -static int -AddEnsemblePart( - Tcl_Interp *interp, /* interpreter to be updated */ - Ensemble* ensData, /* ensemble that will contain this part */ - const char* partName, /* name of the new part */ - const char* usageInfo, /* usage info for argument list */ - Tcl_ObjCmdProc *objProc, /* handling procedure for part */ - ClientData clientData, /* client data associated with part */ - Tcl_CmdDeleteProc *deleteProc, /* procedure used to destroy client data */ - int flags, - EnsemblePart **rVal) /* returns: new ensemble part */ -{ - Tcl_Obj *mapDict; - Tcl_Command cmd; - EnsemblePart *ensPart; - - /* - * Install the new part into the part list. - */ - if (CreateEnsemblePart(interp, ensData, partName, &ensPart) != TCL_OK) { - return TCL_ERROR; - } - - if (usageInfo) { - ensPart->usage = ckalloc((unsigned)(strlen(usageInfo)+1)); - strcpy(ensPart->usage, usageInfo); - } - ensPart->objProc = objProc; - ensPart->clientData = clientData; - ensPart->deleteProc = deleteProc; - ensPart->flags = flags; - - mapDict = NULL; - Tcl_GetEnsembleMappingDict(NULL, ensData->cmdPtr, &mapDict); - if (mapDict == NULL) { - mapDict = Tcl_NewObj(); - ensPart->newMapDict = mapDict; - } - ensPart->mapNamePtr = Tcl_NewStringObj(ensData->nsPtr->fullName, -1); - Tcl_AppendToObj(ensPart->mapNamePtr, "::", 2); - Tcl_AppendToObj(ensPart->mapNamePtr, partName, -1); - Tcl_IncrRefCount(ensPart->namePtr); - Tcl_IncrRefCount(ensPart->mapNamePtr); - Tcl_DictObjPut(NULL, mapDict, ensPart->namePtr, ensPart->mapNamePtr); - cmd = Tcl_CreateObjCommand(interp, Tcl_GetString(ensPart->mapNamePtr), - EnsembleSubCmd, ensPart, DeleteEnsemblePart); - if (cmd == NULL) { - Tcl_DictObjRemove(NULL, mapDict, ensPart->namePtr); - Tcl_DecrRefCount(ensPart->namePtr); - Tcl_DecrRefCount(ensPart->mapNamePtr); - return TCL_ERROR; - } - Tcl_SetEnsembleMappingDict(interp, ensData->cmdPtr, mapDict); - *rVal = ensPart; - return TCL_OK; -} - - -/* - *---------------------------------------------------------------------- - * - * DeleteEnsemble -- - * - * Invoked when the command associated with an ensemble is - * destroyed, to delete the ensemble. Destroys all parts - * included in the ensemble, and frees all memory associated - * with it. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -static void -DeleteEnsemble( - ClientData clientData) /* ensemble data */ -{ - FOREACH_HASH_DECLS; - ItclObjectInfo *infoPtr; - Ensemble* ensData; - Ensemble* ensData2; - - ensData = (Ensemble*)clientData; - /* remove the unknown handler if set to release the Tcl_Obj of the name */ - if (Tcl_FindCommand(ensData->interp, Tcl_GetString(ensData->namePtr), - NULL, 0) != NULL) { - Tcl_SetEnsembleUnknownHandler(NULL, ensData->cmdPtr, NULL); - } - /* - * BE CAREFUL: Each ensemble part removes itself from the list. - * So keep deleting the first part until all parts are gone. - */ - while (ensData->numParts > 0) { - DeleteEnsemblePart(ensData->parts[0]); - } - Tcl_DecrRefCount(ensData->namePtr); - ckfree((char*)ensData->parts); - ensData->parts = NULL; - ensData->numParts = 0; - infoPtr = Tcl_GetAssocData(ensData->interp, ITCL_INTERP_DATA, NULL); - FOREACH_HASH_VALUE(ensData2, &infoPtr->ensembleInfo->ensembles) { - if (ensData2 == ensData) { - Tcl_DeleteHashEntry(hPtr); - } - } - ckfree((char*)ensData); -} - - -/* - *---------------------------------------------------------------------- - * - * FindEnsemble -- - * - * Searches for an ensemble command and follows a path to - * sub-ensembles. - * - * Results: - * Returns TCL_OK if the ensemble was found, along with a - * pointer to the ensemble data in "ensDataPtr". Returns - * TCL_ERROR if anything goes wrong. - * - * Side effects: - * If anything goes wrong, this procedure returns an error - * message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ -static int -FindEnsemble( - Tcl_Interp *interp, /* interpreter containing the ensemble */ - const char **nameArgv, /* path of names leading to ensemble */ - int nameArgc, /* number of strings in nameArgv */ - Ensemble** ensDataPtr) /* returns: ensemble data */ -{ - int i; - Tcl_Command cmdPtr; - Ensemble *ensData; - EnsemblePart *ensPart; - Tcl_Obj *objPtr; - Tcl_CmdInfo cmdInfo; - Tcl_InterpDeleteProc *procPtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - - *ensDataPtr = NULL; /* assume that no data will be found */ - - /* - * If there are no names in the path, then return an error. - */ - if (nameArgc < 1) { - Tcl_AppendToObj(Tcl_GetObjResult(interp), - "invalid ensemble name \"\"", -1); - return TCL_ERROR; - } - - /* - * Use the first name to find the command for the top-level - * ensemble. - */ - objPtr = Tcl_NewStringObj(nameArgv[0], -1); - cmdPtr = Tcl_FindEnsemble(interp, objPtr, 0); - Tcl_DecrRefCount(objPtr); - - if (cmdPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "command \"", nameArgv[0], "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, (char *)cmdPtr); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "command \"", nameArgv[0], "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - ensData = (Ensemble *)Tcl_GetHashValue(hPtr); - - /* - * Follow the trail of sub-ensemble names. - */ - for (i=1; i < nameArgc; i++) { - if (FindEnsemblePart(interp, ensData, nameArgv[i], &ensPart) - != TCL_OK) { - return TCL_ERROR; - } - if (ensPart == NULL) { - char *pname = Tcl_Merge(i, nameArgv); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid ensemble name \"", pname, "\"", - (char*)NULL); - ckfree(pname); - return TCL_ERROR; - } - - cmdPtr = ensPart->cmdPtr; - if (cmdPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "part \"", nameArgv[i], "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - if (!Tcl_IsEnsemble(cmdPtr)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "part \"", nameArgv[i], "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - if (Tcl_GetCommandInfoFromToken(cmdPtr, &cmdInfo) != 1) { - return TCL_ERROR; - } - ensData = (Ensemble*)cmdInfo.objClientData; - } - *ensDataPtr = ensData; - - return TCL_OK; -} - - -/* - *---------------------------------------------------------------------- - * - * CreateEnsemblePart -- - * - * Creates a new part within an ensemble. - * - * Results: - * If successful, this procedure returns TCL_OK, along with a - * pointer to the new part in "ensPartPtr". If a part with the - * same name already exists, this procedure returns TCL_ERROR. - * - * Side effects: - * If anything goes wrong, this procedure returns an error - * message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ -static int -CreateEnsemblePart( - Tcl_Interp *interp, /* interpreter containing the ensemble */ - Ensemble *ensData, /* ensemble being modified */ - const char* partName, /* name of the new part */ - EnsemblePart **ensPartPtr) /* returns: new ensemble part */ -{ - int i; - int pos; - int size; - EnsemblePart** partList; - EnsemblePart* ensPart; - - /* - * If a matching entry was found, then return an error. - */ - if (FindEnsemblePartIndex(ensData, partName, &pos)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "part \"", partName, "\" already exists in ensemble", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Otherwise, make room for a new entry. Keep the parts in - * lexicographical order, so we can search them quickly - * later. - */ - if (ensData->numParts >= ensData->maxParts) { - size = ensData->maxParts*sizeof(EnsemblePart*); - partList = (EnsemblePart**)ckalloc((unsigned)2*size); - memcpy(partList, ensData->parts, (size_t)size); - ckfree((char*)ensData->parts); - - ensData->parts = partList; - ensData->maxParts *= 2; - } - - for (i=ensData->numParts; i > pos; i--) { - ensData->parts[i] = ensData->parts[i-1]; - } - ensData->numParts++; - - ensPart = (EnsemblePart*)ckalloc(sizeof(EnsemblePart)); - memset(ensPart, 0, sizeof(EnsemblePart)); - ensPart->name = (char*)ckalloc((unsigned)(strlen(partName)+1)); - strcpy(ensPart->name, partName); - ensPart->namePtr = Tcl_NewStringObj(ensPart->name, -1); - ensPart->ensemble = ensData; - ensPart->interp = interp; - - ensData->parts[pos] = ensPart; - - /* - * Compare the new part against the one on either side of - * it. Determine how many letters are needed in each part - * to guarantee that an abbreviated form is unique. Update - * the parts on either side as well, since they are influenced - * by the new part. - */ - ComputeMinChars(ensData, pos); - ComputeMinChars(ensData, pos-1); - ComputeMinChars(ensData, pos+1); - - *ensPartPtr = ensPart; - return TCL_OK; -} - - -/* - *---------------------------------------------------------------------- - * - * DeleteEnsemblePart -- - * - * Deletes a single part from an ensemble. The part must have - * been created previously by CreateEnsemblePart. - * - * If the part has a delete proc, then it is called to free the - * associated client data. - * - * Results: - * None. - * - * Side effects: - * Delete proc is called. - * - *---------------------------------------------------------------------- - */ -static void -DeleteEnsemblePart( - ClientData clientData) /* part being destroyed */ -{ - Tcl_Obj *mapDict; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - Ensemble *ensData; - Ensemble *ensData2; - EnsemblePart *ensPart; - int i; - int pos; - - mapDict = NULL; - ensPart = (EnsemblePart *)clientData; - if (ensPart == NULL) { - return; - } - ensData = ensPart->ensemble; - - /* - * If this part has a delete proc, then call it to free - * up the client data. - */ - if ((ensPart->deleteProc != NULL) && (ensPart->clientData != NULL)) { - (*ensPart->deleteProc)(ensPart->clientData); - } - - /* if it is a subensemble remove the command to free the data */ - if (ensPart->subEnsemblePtr != NULL) { - infoPtr = Tcl_GetAssocData(ensData->interp, ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->subEnsembles, - (char *)ensPart->subEnsemblePtr); - if (hPtr != NULL) { - ensData2 = Tcl_GetHashValue(hPtr); - Tcl_DeleteNamespace(ensData2->nsPtr); - Tcl_DeleteHashEntry(hPtr); - } - Tcl_SetEnsembleUnknownHandler(NULL, ensPart->cmdPtr, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, - (char *)ensPart->ensemble->cmdPtr); - if (hPtr != NULL) { - ensData2 = Tcl_GetHashValue(hPtr); - Tcl_GetEnsembleMappingDict(NULL, ensData2->cmdPtr, &mapDict); - if (mapDict != NULL) { - Tcl_DictObjRemove(ensPart->interp, mapDict, - ensPart->namePtr); - Tcl_SetEnsembleMappingDict(NULL, ensData2->cmdPtr, mapDict); - } - } - Tcl_DecrRefCount(ensPart->subEnsemblePtr); - if (ensPart->newMapDict != NULL) { - Tcl_DecrRefCount(ensPart->newMapDict); - } - } - /* - * Find this part within its ensemble, and remove it from - * the list of parts. - */ - if (FindEnsemblePartIndex(ensPart->ensemble, ensPart->name, &pos)) { - ensData = ensPart->ensemble; - for (i=pos; i < ensData->numParts-1; i++) { - ensData->parts[i] = ensData->parts[i+1]; - } - ensData->numParts--; - } - - /* - * Free the memory associated with the part. - */ - mapDict = NULL; - if (Tcl_FindCommand(ensData->interp, Tcl_GetString(ensData->namePtr), - NULL, 0) != NULL) { - Tcl_GetEnsembleMappingDict(ensData->interp, ensData->cmdPtr, &mapDict); - if (mapDict != NULL) { - if (!Tcl_IsShared(mapDict)) { - Tcl_DictObjRemove(ensPart->interp, mapDict, ensPart->namePtr); - Tcl_SetEnsembleMappingDict(ensPart->interp, ensData->cmdPtr, - mapDict); - } - } - } - /* this is the map !!! */ - if (ensPart->mapNamePtr != NULL) { - Tcl_DecrRefCount(ensPart->mapNamePtr); - } - Tcl_DecrRefCount(ensPart->namePtr); - if (ensPart->usage != NULL) { - ckfree(ensPart->usage); - } - ckfree(ensPart->name); - ckfree((char*)ensPart); -} - - -/* - *---------------------------------------------------------------------- - * - * FindEnsemblePart -- - * - * Searches for a part name within an ensemble. Recognizes - * unique abbreviations for part names. - * - * Results: - * If the part name is not a unique abbreviation, this procedure - * returns TCL_ERROR. Otherwise, it returns TCL_OK. If the - * part can be found, "rensPart" returns a pointer to the part. - * Otherwise, it returns NULL. - * - * Side effects: - * If anything goes wrong, this procedure returns an error - * message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ -static int -FindEnsemblePart( - Tcl_Interp *interp, /* interpreter containing the ensemble */ - Ensemble *ensData, /* ensemble being searched */ - const char* partName, /* name of the desired part */ - EnsemblePart **rensPart) /* returns: pointer to the desired part */ -{ - int pos = 0; - int first, last, nlen; - int i, cmp; - - *rensPart = NULL; - - /* - * Search for the desired part name. - * All parts are in lexicographical order, so use a - * binary search to find the part quickly. Match only - * as many characters as are included in the specified - * part name. - */ - first = 0; - last = ensData->numParts-1; - nlen = strlen(partName); - - while (last >= first) { - pos = (first+last)/2; - if (*partName == *ensData->parts[pos]->name) { - cmp = strncmp(partName, ensData->parts[pos]->name, nlen); - if (cmp == 0) { - break; /* found it! */ - } - } - else if (*partName < *ensData->parts[pos]->name) { - cmp = -1; - } - else { - cmp = 1; - } - - if (cmp > 0) { - first = pos+1; - } else { - last = pos-1; - } - } - - /* - * If a matching entry could not be found, then quit. - */ - if (last < first) { - return TCL_OK; - } - - /* - * If a matching entry was found, there may be some ambiguity - * if the user did not specify enough characters. Find the - * top-most match in the list, and see if the part name has - * enough characters. If there are two parts like "foo" - * and "food", this allows us to match "foo" exactly. - */ - if (nlen < ensData->parts[pos]->minChars) { - while (pos > 0) { - pos--; - if (strncmp(partName, ensData->parts[pos]->name, nlen) != 0) { - pos++; - break; - } - } - } - if (nlen < ensData->parts[pos]->minChars) { - Tcl_Obj *resultPtr = Tcl_NewStringObj((char*)NULL, 0); - - Tcl_AppendStringsToObj(resultPtr, - "ambiguous option \"", partName, "\": should be one of...", - (char*)NULL); - - for (i=pos; i < ensData->numParts; i++) { - if (strncmp(partName, ensData->parts[i]->name, nlen) != 0) { - break; - } - Tcl_AppendToObj(resultPtr, "\n ", 3); - GetEnsemblePartUsage(interp, ensData, ensData->parts[i], resultPtr); - } - Tcl_SetObjResult(interp, resultPtr); - return TCL_ERROR; - } - - /* - * Found a match. Return the desired part. - */ - *rensPart = ensData->parts[pos]; - return TCL_OK; -} - - -/* - *---------------------------------------------------------------------- - * - * FindEnsemblePartIndex -- - * - * Searches for a part name within an ensemble. The part name - * must be an exact match for an existing part name in the - * ensemble. This procedure is useful for managing (i.e., - * creating and deleting) parts in an ensemble. - * - * Results: - * If an exact match is found, this procedure returns - * non-zero, along with the index of the part in posPtr. - * Otherwise, it returns zero, along with an index in posPtr - * indicating where the part should be. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ -static int -FindEnsemblePartIndex( - Ensemble *ensData, /* ensemble being searched */ - const char *partName, /* name of desired part */ - int *posPtr) /* returns: index for part */ -{ - int pos = 0; - int first, last; - int cmp; - - /* - * Search for the desired part name. - * All parts are in lexicographical order, so use a - * binary search to find the part quickly. - */ - first = 0; - last = ensData->numParts-1; - - while (last >= first) { - pos = (first+last)/2; - if (*partName == *ensData->parts[pos]->name) { - cmp = strcmp(partName, ensData->parts[pos]->name); - if (cmp == 0) { - break; /* found it! */ - } - } - else if (*partName < *ensData->parts[pos]->name) { - cmp = -1; - } - else { - cmp = 1; - } - - if (cmp > 0) { - first = pos+1; - } else { - last = pos-1; - } - } - - if (last >= first) { - *posPtr = pos; - return 1; - } - *posPtr = first; - return 0; -} - - -/* - *---------------------------------------------------------------------- - * - * ComputeMinChars -- - * - * Compares part names on an ensemble's part list and - * determines the minimum number of characters needed for a - * unique abbreviation. The parts on either side of a - * particular part index are compared. As long as there is - * a part on one side or the other, this procedure updates - * the parts to have the proper minimum abbreviations. - * - * Results: - * None. - * - * Side effects: - * Updates three parts within the ensemble to remember - * the minimum abbreviations. - * - *---------------------------------------------------------------------- - */ -static void -ComputeMinChars( - Ensemble *ensData, /* ensemble being modified */ - int pos) /* index of part being updated */ -{ - int min, max; - char *p, *q; - - /* - * If the position is invalid, do nothing. - */ - if (pos < 0 || pos >= ensData->numParts) { - return; - } - - /* - * Start by assuming that only the first letter is required - * to uniquely identify this part. Then compare the name - * against each neighboring part to determine the real minimum. - */ - ensData->parts[pos]->minChars = 1; - - if (pos-1 >= 0) { - p = ensData->parts[pos]->name; - q = ensData->parts[pos-1]->name; - for (min=1; *p == *q && *p != '\0' && *q != '\0'; min++) { - p++; - q++; - } - if (min > ensData->parts[pos]->minChars) { - ensData->parts[pos]->minChars = min; - } - } - - if (pos+1 < ensData->numParts) { - p = ensData->parts[pos]->name; - q = ensData->parts[pos+1]->name; - for (min=1; *p == *q && *p != '\0' && *q != '\0'; min++) { - p++; - q++; - } - if (min > ensData->parts[pos]->minChars) { - ensData->parts[pos]->minChars = min; - } - } - - max = strlen(ensData->parts[pos]->name); - if (ensData->parts[pos]->minChars > max) { - ensData->parts[pos]->minChars = max; - } -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_EnsembleCmd -- - * - * Invoked by Tcl whenever the user issues the "ensemble" - * command to manipulate an ensemble. Handles the following - * syntax: - * - * ensemble <ensName> ?<command> <arg> <arg>...? - * ensemble <ensName> { - * part <partName> <args> <body> - * ensemble <ensName> { - * ... - * } - * } - * - * Finds or creates the ensemble <ensName>, and then executes - * the commands to add parts. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything - * goes wrong. - * - * Side effects: - * If anything goes wrong, this procedure returns an error - * message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ -int -Itcl_EnsembleCmd( - ClientData clientData, /* ensemble data */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int status; - char *ensName; - EnsembleParser *ensInfo; - Ensemble *ensData; - Ensemble *savedEnsData; - EnsemblePart *ensPart; - Tcl_Command cmd; - Tcl_Obj *objPtr; - Tcl_HashEntry *hPtr; - Tcl_InterpDeleteProc *procPtr; - ItclObjectInfo *infoPtr; - - ItclShowArgs(1, "Itcl_EnsembleCmd", objc, objv); - /* - * Make sure that an ensemble name was specified. - */ - if (objc < 2) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", - Tcl_GetStringFromObj(objv[0], (int*)NULL), - " name ?command arg arg...?\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this is the "ensemble" command in the main interpreter, - * then the client data will be null. Otherwise, it is - * the "ensemble" command in the ensemble body parser, and - * the client data indicates which ensemble we are modifying. - */ - if (clientData) { - ensInfo = (EnsembleParser*)clientData; - } else { - ensInfo = GetEnsembleParser(interp); - } - ensData = ensInfo->ensData; - - /* - * Find or create the desired ensemble. If an ensemble is - * being built, then this "ensemble" command is enclosed in - * another "ensemble" command. Use the current ensemble as - * the parent, and find or create an ensemble part within it. - */ - ensName = Tcl_GetString(objv[1]); - - if (ensData) { - if (FindEnsemblePart(ensInfo->master, ensData, ensName, &ensPart) != TCL_OK) { - ensPart = NULL; - } - if (ensPart == NULL) { - if (CreateEnsemble(ensInfo->master, ensData, ensName) != TCL_OK) { - Tcl_TransferResult(ensInfo->master, TCL_ERROR, interp); - return TCL_ERROR; - } - if (FindEnsemblePart(ensInfo->master, ensData, ensName, &ensPart) - != TCL_OK) { - Tcl_Panic("Itcl_EnsembleCmd: can't create ensemble"); - } - } - - cmd = ensPart->cmdPtr; - infoPtr = Tcl_GetAssocData(ensInfo->master, ITCL_INTERP_DATA, &procPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, - (char *)ensPart->cmdPtr); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "part \"", Tcl_GetStringFromObj(objv[1], (int*)NULL), - "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - ensData = (Ensemble *)Tcl_GetHashValue(hPtr); - } else { - - /* - * Otherwise, the desired ensemble is a top-level ensemble. - * Find or create the access command for the ensemble, and - * then get its data. - */ - cmd = Tcl_FindCommand(interp, ensName, (Tcl_Namespace*)NULL, 0); - if (cmd == NULL) { - if (CreateEnsemble(interp, (Ensemble*)NULL, ensName) - != TCL_OK) { - return TCL_ERROR; - } - cmd = Tcl_FindCommand(interp, ensName, (Tcl_Namespace*)NULL, 0); - } - - if (cmd == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "command \"", Tcl_GetStringFromObj(objv[1], (int*)NULL), - "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, (char *)cmd); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "command \"", Tcl_GetStringFromObj(objv[1], (int*)NULL), - "\" is not an ensemble", - (char*)NULL); - return TCL_ERROR; - } - ensData = (Ensemble *)Tcl_GetHashValue(hPtr); - } - - /* - * At this point, we have the data for the ensemble that is - * being manipulated. Plug this into the parser, and then - * interpret the rest of the arguments in the ensemble parser. - */ - status = TCL_OK; - savedEnsData = ensInfo->ensData; - ensInfo->ensData = ensData; - - if (objc == 3) { - status = Tcl_EvalObjEx(ensInfo->parser, objv[2], 0); - } else { - if (objc > 3) { - objPtr = Tcl_NewListObj(objc-2, objv+2); - Tcl_IncrRefCount(objPtr); /* stop Eval trashing it */ - status = Tcl_EvalObjEx(ensInfo->parser, objPtr, 0); - Tcl_DecrRefCount(objPtr); /* we're done with the object */ - } - } - - /* - * Copy the result from the parser interpreter to the - * master interpreter. If an error was encountered, - * copy the error info first, and then set the result. - * Otherwise, the offending command is reported twice. - */ - if (status == TCL_ERROR) { - /* no longer needed, no extra interpreter !! */ - const char *errInfo = Tcl_GetVar2(ensInfo->parser, "::errorInfo", - (char*)NULL, TCL_GLOBAL_ONLY); - - if (errInfo) { - Tcl_AddObjErrorInfo(interp, (const char *)errInfo, -1); - } - - if (objc == 3) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (\"ensemble\" body line %d)", - Tcl_GetErrorLine(ensInfo->parser))); - } - } - Tcl_SetObjResult(interp, Tcl_GetObjResult(ensInfo->parser)); - - ensInfo->ensData = savedEnsData; - return status; -} - - -/* - *---------------------------------------------------------------------- - * - * GetEnsembleParser -- - * - * Returns the slave interpreter that acts as a parser for - * the body of an "ensemble" definition. The first time that - * this is called for an interpreter, the parser is created - * and registered as associated data. After that, it is - * simply returned. - * - * Results: - * Returns a pointer to the ensemble parser data structure. - * - * Side effects: - * On the first call, the ensemble parser is created and - * registered as "itcl_ensembleParser" with the interpreter. - * - *---------------------------------------------------------------------- - */ -static EnsembleParser* -GetEnsembleParser( - Tcl_Interp *interp) /* interpreter handling the ensemble */ -{ - EnsembleParser *ensInfo; - - /* - * Look for an existing ensemble parser. If it is found, - * return it immediately. - */ - ensInfo = (EnsembleParser*) Tcl_GetAssocData(interp, - "itcl_ensembleParser", NULL); - - if (ensInfo) { - return ensInfo; - } - - /* - * Create a slave interpreter that can be used to parse - * the body of an ensemble definition. - */ - ensInfo = (EnsembleParser*)ckalloc(sizeof(EnsembleParser)); - ensInfo->master = interp; - ensInfo->parser = Tcl_CreateInterp(); - ensInfo->ensData = NULL; - - Tcl_DeleteNamespace(Tcl_GetGlobalNamespace(ensInfo->parser)); - /* - * Add the allowed commands to the parser interpreter: - * part, delete, ensemble - */ - Tcl_CreateObjCommand(ensInfo->parser, "part", Itcl_EnsPartCmd, - (ClientData)ensInfo, (Tcl_CmdDeleteProc*)NULL); - - Tcl_CreateObjCommand(ensInfo->parser, "option", Itcl_EnsPartCmd, - (ClientData)ensInfo, (Tcl_CmdDeleteProc*)NULL); - - Tcl_CreateObjCommand(ensInfo->parser, "ensemble", Itcl_EnsembleCmd, - (ClientData)ensInfo, (Tcl_CmdDeleteProc*)NULL); - - /* - * Install the parser data, so we'll have it the next time - * we call this procedure. - */ - (void) Tcl_SetAssocData(interp, "itcl_ensembleParser", - DeleteEnsParser, (ClientData)ensInfo); - - return ensInfo; -} - - -/* - *---------------------------------------------------------------------- - * - * DeleteEnsParser -- - * - * Called when an interpreter is destroyed to clean up the - * ensemble parser within it. Destroys the slave interpreter - * and frees up the data associated with it. - * - * Results: - * None. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - /* ARGSUSED */ -static void -DeleteEnsParser( - ClientData clientData, /* client data for ensemble-related commands */ - Tcl_Interp *interp) /* interpreter containing the data */ -{ - EnsembleParser* ensInfo = (EnsembleParser*)clientData; - Tcl_DeleteInterp(ensInfo->parser); - ckfree((char*)ensInfo); -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_EnsPartCmd -- - * - * Invoked by Tcl whenever the user issues the "part" command - * to manipulate an ensemble. This command can only be used - * inside the "ensemble" command, which handles ensembles. - * Handles the following syntax: - * - * ensemble <ensName> { - * part <partName> <args> <body> - * } - * - * Adds a new part called <partName> to the ensemble. If a - * part already exists with that name, it is an error. The - * new part is handled just like an ordinary Tcl proc, with - * a list of <args> and a <body> of code to execute. - * - * Results: - * Returns TCL_OK if successful, and TCL_ERROR if anything - * goes wrong. - * - * Side effects: - * If anything goes wrong, this procedure returns an error - * message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ -int -Itcl_EnsPartCmd( - ClientData clientData, /* ensemble data */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *usagePtr; - Tcl_Proc procPtr; - EnsembleParser *ensInfo = (EnsembleParser*)clientData; - Ensemble *ensData = (Ensemble*)ensInfo->ensData; - EnsemblePart *ensPart; - ItclArgList *arglistPtr; - char *partName; - char *usage; - int result; - int argc; - int maxArgc; - Tcl_CmdInfo cmdInfo; - - ItclShowArgs(1, "Itcl_EnsPartCmd", objc, objv); - if (objc != 4) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", - Tcl_GetStringFromObj(objv[0], (int*)NULL), - " name args body\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Create a Tcl-style proc definition using the specified args - * and body. This is not a proc in the usual sense. It belongs - * to the namespace that contains the ensemble, but it is - * accessed through the ensemble, not through a Tcl command. - */ - partName = Tcl_GetStringFromObj(objv[1], (int*)NULL); - - if (ItclCreateArgList(interp, Tcl_GetString(objv[2]), &argc, &maxArgc, - &usagePtr, &arglistPtr, NULL, partName) != TCL_OK) { - result = TCL_ERROR; - goto errorOut; - } - if (Tcl_GetCommandInfoFromToken(ensData->cmdPtr, &cmdInfo) != 1) { - result = TCL_ERROR; - goto errorOut; - } - if (Tcl_CreateProc(ensInfo->master, cmdInfo.namespacePtr, partName, objv[2], objv[3], - &procPtr) != TCL_OK) { - Tcl_TransferResult(ensInfo->master, TCL_ERROR, interp); - result = TCL_ERROR; - goto errorOut; - } - - usage = Tcl_GetString(usagePtr); - - /* - * Create a new part within the ensemble. If successful, - * plug the command token into the proc; we'll need it later - * if we try to compile the Tcl code for the part. If - * anything goes wrong, clean up before bailing out. - */ - result = AddEnsemblePart(ensInfo->master, ensData, partName, usage, - Tcl_GetObjInterpProc(), (ClientData)procPtr, _Tcl_ProcDeleteProc, - ITCL_ENSEMBLE_ENSEMBLE, &ensPart); - Tcl_TransferResult(ensInfo->master, result, interp); - -errorOut: - Tcl_DecrRefCount(usagePtr); - ItclDeleteArgList(arglistPtr); - return result; -} - - -/* - *---------------------------------------------------------------------- - * - * Itcl_EnsembleErrorCmd -- - * - * Invoked when the user tries to access an unknown part for - * an ensemble. Acts as the default handler for the "@error" - * part. Generates an error message like: - * - * bad option "foo": should be one of... - * info args procname - * info body procname - * info cmdcount - * ... - * - * Results: - * Always returns TCL_OK. - * - * Side effects: - * Returns the error message as the result in the interpreter. - * - *---------------------------------------------------------------------- - */ - /* ARGSUSED */ -int -Itcl_EnsembleErrorCmd( - ClientData clientData, /* ensemble info */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Ensemble *ensData = (Ensemble*)clientData; - - char *cmdName; - Tcl_Obj *objPtr; - - cmdName = Tcl_GetString(objv[0]); - - objPtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_AppendStringsToObj(objPtr, - "bad option \"", cmdName, "\": should be one of...\n", - (char*)NULL); - GetEnsembleUsage(interp, ensData, objPtr); - - Tcl_SetResult(interp, Tcl_GetString(objPtr), TCL_VOLATILE); - Tcl_DecrRefCount(objPtr); - return TCL_ERROR; -} - -/* - *---------------------------------------------------------------------- - * - * EnsembleSubCmd -- - * - *---------------------------------------------------------------------- - */ - -static int -CallInvokeEnsembleMethod( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Namespace *nsPtr = data[0]; - EnsemblePart *ensPart = data[1]; - int objc = PTR2INT(data[2]); - Tcl_Obj *const*objv = data[3]; - - result = Itcl_InvokeEnsembleMethod(interp, nsPtr, ensPart->namePtr, - (Tcl_Proc *)ensPart->clientData, objc, objv); - return result; -} - -static int -CallInvokeEnsembleMethod2( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - EnsemblePart *ensPart = data[0]; - int objc = PTR2INT(data[1]); - Tcl_Obj *const*objv = data[2]; - result = (*ensPart->objProc)(ensPart->clientData, interp, objc, objv); - return result; -} - -static int -EnsembleSubCmd( - ClientData clientData, /* ensPart struct pointer */ - Tcl_Interp *interp, /* Current interpreter. */ - int objc, /* Number of arguments. */ - Tcl_Obj *const objv[]) /* Argument objects. */ -{ - int result; - Tcl_Namespace *nsPtr; - EnsemblePart *ensPart; - void *callbackPtr; - - ItclShowArgs(1, "EnsembleSubCmd", objc, objv); - result = TCL_OK; - ensPart = (EnsemblePart *)clientData; - nsPtr = Tcl_GetCurrentNamespace(interp); - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - if (ensPart->flags & ITCL_ENSEMBLE_ENSEMBLE) { - /* FIXME !!! */ - if (ensPart->clientData == NULL) { - return TCL_ERROR; - } - Tcl_NRAddCallback(interp, CallInvokeEnsembleMethod, nsPtr, ensPart, INT2PTR(objc), (ClientData)objv); - } else { - Tcl_NRAddCallback(interp, CallInvokeEnsembleMethod2, ensPart, INT2PTR(objc), (ClientData)objv, NULL); - } - result = Itcl_NRRunCallbacks(interp, callbackPtr); - return result; -} -/* - * ------------------------------------------------------------------------ - * EnsembleUnknownCmd() - * - * the unknown handler for the ensemble commands - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -EnsembleUnknownCmd( - ClientData dummy, /* not used */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Command cmd; - Tcl_HashEntry *hPtr; - Tcl_InterpDeleteProc *procPtr; - ItclObjectInfo *infoPtr; - EnsemblePart *ensPart; - Ensemble *ensData; - - ItclShowArgs(2, "EnsembleUnknownCmd", objc, objv); - cmd = Tcl_GetCommandFromObj(interp, objv[1]); - if (cmd == NULL) { - Tcl_AppendResult(interp, "EnsembleUnknownCmd, ensemble not found!", - Tcl_GetString(objv[1]), NULL); - return TCL_ERROR; - } - infoPtr = Tcl_GetAssocData(interp, ITCL_INTERP_DATA, &procPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, (char *)cmd); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "EnsembleUnknownCmd, ensemble struct not ", - "found!", Tcl_GetString(objv[1]), NULL); - return TCL_ERROR; - } - ensData = (Ensemble *)Tcl_GetHashValue(hPtr); - if (objc < 3) { - /* produce usage message */ - Tcl_Obj *objPtr = Tcl_NewStringObj( - "wrong # args: should be one of...\n", -1); - GetEnsembleUsage(interp, ensData, objPtr); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - if (FindEnsemblePart(interp, ensData, "@error", &ensPart) != TCL_OK) { - Tcl_AppendResult(interp, "FindEnsemblePart error", NULL); - return TCL_ERROR; - } - if (ensPart != NULL) { - Tcl_Obj *listPtr; - - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_ListObjAppendElement(NULL, listPtr, objv[1]); - Tcl_ListObjAppendElement(NULL, listPtr, Tcl_NewStringObj("@error", -1)); - Tcl_ListObjAppendElement(NULL, listPtr, objv[2]); - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; - } - - return Itcl_EnsembleErrorCmd(ensData, interp, objc-2, objv+2); -} - -/* - *---------------------------------------------------------------------- - * - * Itcl_EnsembleDeleteCmd -- - * - * Invoked when the user tries to delet an ensemble - *---------------------------------------------------------------------- - */ -int -Itcl_EnsembleDeleteCmd( - ClientData clientData, /* infoPtr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Command cmdPtr; - Ensemble *ensData; - ItclObjectInfo *infoPtr; - int i; - - infoPtr = (ItclObjectInfo *)clientData; - ItclShowArgs(1, "Itcl_EnsembleDeleteCmd", objc, objv); - for (i = 1; i < objc; i++) { - cmdPtr = Tcl_FindCommand(interp, Tcl_GetString(objv[i]), NULL, 0); - if (cmdPtr == NULL) { - Tcl_AppendResult(interp, "no such ensemble \"", - Tcl_GetString(objv[i]), "\"", NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&infoPtr->ensembleInfo->ensembles, (char *)cmdPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "no such ensemble \"", - Tcl_GetString(objv[i]), "\"", NULL); - return TCL_ERROR; - } - ensData = Tcl_GetHashValue(hPtr); - Itcl_RenameCommand(ensData->interp, Tcl_GetString(ensData->namePtr), ""); - if (Tcl_FindNamespace(interp, ensData->nsPtr->fullName, NULL, 0) - != NULL) { - Tcl_DeleteNamespace(ensData->nsPtr); - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * Itcl_FinishEnsemble -- - * - * Invoked when itcl package is finished or ItclFinishCmd is called - *---------------------------------------------------------------------- - */ -void -ItclFinishEnsemble( - ItclObjectInfo *infoPtr) -{ - EnsembleParser *ensInfo; - - ensInfo = (EnsembleParser*) Tcl_GetAssocData(infoPtr->interp, - "itcl_ensembleParser", NULL); - ckfree((char *)ensInfo); - /* FIXME have to cleanup contents of infoPtr->ensembleInfo */ - ckfree((char *)infoPtr->ensembleInfo); -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclHelpers.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclHelpers.c deleted file mode 100644 index a3f136b..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclHelpers.c +++ /dev/null @@ -1,1510 +0,0 @@ -/* - * itclHelpers.c -- - * - * This file contains the C-implemeted part of - * Itcl - * - * Copyright (c) 2007 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include "itclInt.h" - -void ItclDeleteArgList(ItclArgList *arglistPtr); -#ifdef ITCL_DEBUG -int _itcl_debug_level = 0; - -/* - * ------------------------------------------------------------------------ - * ItclShowArgs() - * ------------------------------------------------------------------------ - */ - -void -ItclShowArgs( - int level, - const char *str, - int objc, - Tcl_Obj * const* objv) -{ - int i; - - if (level > _itcl_debug_level) { - return; - } - fprintf(stderr, "%s", str); - for (i = 0; i < objc; i++) { - fprintf(stderr, "!%s", objv[i] == NULL ? "??" : - Tcl_GetString(objv[i])); - } - fprintf(stderr, "!\n"); -} -#endif - -/* - * ------------------------------------------------------------------------ - * Itcl_ProtectionStr() - * - * Converts an integer protection code (ITCL_PUBLIC, ITCL_PROTECTED, - * or ITCL_PRIVATE) into a human-readable character string. Returns - * a pointer to this string. - * ------------------------------------------------------------------------ - */ -const char* -Itcl_ProtectionStr( - int pLevel) /* protection level */ -{ - switch (pLevel) { - case ITCL_PUBLIC: - return "public"; - case ITCL_PROTECTED: - return "protected"; - case ITCL_PRIVATE: - return "private"; - } - return "<bad-protection-code>"; -} - -/* - * ------------------------------------------------------------------------ - * ItclCreateArgList() - * ------------------------------------------------------------------------ - */ - -int -ItclCreateArgList( - Tcl_Interp *interp, /* interpreter managing this function */ - const char *str, /* string representing argument list */ - int *argcPtr, /* number of mandatory arguments */ - int *maxArgcPtr, /* number of arguments parsed */ - Tcl_Obj **usagePtr, /* store usage message for arguments here */ - ItclArgList **arglistPtrPtr, - /* returns pointer to parsed argument list */ - ItclMemberFunc *mPtr, - const char *commandName) -{ - int argc; - int defaultArgc; - const char **argv; - const char **defaultArgv; - ItclArgList *arglistPtr; - ItclArgList *lastArglistPtr; - int i; - int hadArgsArgument; - int result; - - *arglistPtrPtr = NULL; - lastArglistPtr = NULL; - argc = 0; - hadArgsArgument = 0; - result = TCL_OK; - *maxArgcPtr = 0; - *argcPtr = 0; - *usagePtr = Tcl_NewStringObj("", -1); - if (str) { - if (Tcl_SplitList(interp, (const char *)str, &argc, &argv) - != TCL_OK) { - return TCL_ERROR; - } - i = 0; - if (argc == 0) { - /* signal there are 0 arguments */ - arglistPtr = (ItclArgList *)ckalloc(sizeof(ItclArgList)); - memset(arglistPtr, 0, sizeof(ItclArgList)); - *arglistPtrPtr = arglistPtr; - } - while (i < argc) { - if (Tcl_SplitList(interp, argv[i], &defaultArgc, &defaultArgv) - != TCL_OK) { - result = TCL_ERROR; - break; - } - arglistPtr = NULL; - if (defaultArgc == 0 || defaultArgv[0][0] == '\0') { - if (commandName != NULL) { - Tcl_AppendResult(interp, "procedure \"", - commandName, - "\" has argument with no name", NULL); - } else { - char buf[10]; - sprintf(buf, "%d", i); - Tcl_AppendResult(interp, "argument #", buf, - " has no name", NULL); - } - result = TCL_ERROR; - break; - } - if (defaultArgc > 2) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "too many fields in argument specifier \"", - argv[i], "\"", - (char*)NULL); - result = TCL_ERROR; - break; - } - if (strstr(defaultArgv[0],"::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad argument name \"", defaultArgv[0], "\"", - (char*)NULL); - result = TCL_ERROR; - break; - } - arglistPtr = (ItclArgList *)ckalloc(sizeof(ItclArgList)); - memset(arglistPtr, 0, sizeof(ItclArgList)); - if (*arglistPtrPtr == NULL) { - *arglistPtrPtr = arglistPtr; - } else { - lastArglistPtr->nextPtr = arglistPtr; - Tcl_AppendToObj(*usagePtr, " ", 1); - } - arglistPtr->namePtr = - Tcl_NewStringObj(defaultArgv[0], -1); - Tcl_IncrRefCount(arglistPtr->namePtr); - (*maxArgcPtr)++; - if (defaultArgc == 1) { - (*argcPtr)++; - arglistPtr->defaultValuePtr = NULL; - if ((strcmp(defaultArgv[0], "args") == 0) && (i == argc-1)) { - hadArgsArgument = 1; - (*argcPtr)--; - Tcl_AppendToObj(*usagePtr, "?arg arg ...?", -1); - } else { - Tcl_AppendToObj(*usagePtr, defaultArgv[0], -1); - } - } else { - arglistPtr->defaultValuePtr = - Tcl_NewStringObj(defaultArgv[1], -1); - Tcl_IncrRefCount(arglistPtr->defaultValuePtr); - Tcl_AppendToObj(*usagePtr, "?", 1); - Tcl_AppendToObj(*usagePtr, defaultArgv[0], -1); - Tcl_AppendToObj(*usagePtr, "?", 1); - } - lastArglistPtr = arglistPtr; - i++; - ckfree((char *) defaultArgv); - } - ckfree((char *) argv); - } - /* - * If anything went wrong, destroy whatever arguments were - * created and return an error. - */ - if (result != TCL_OK) { - ItclDeleteArgList(*arglistPtrPtr); - *arglistPtrPtr = NULL; - } - if (hadArgsArgument) { - *maxArgcPtr = -1; - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteArgList() - * ------------------------------------------------------------------------ - */ - -void -ItclDeleteArgList( - ItclArgList *arglistPtr) /* first argument in arg list chain */ -{ - ItclArgList *currPtr; - ItclArgList *nextPtr; - - for (currPtr=arglistPtr; currPtr; currPtr=nextPtr) { - if (currPtr->defaultValuePtr != NULL) { - Tcl_DecrRefCount(currPtr->defaultValuePtr); - } - if (currPtr->namePtr != NULL) { - Tcl_DecrRefCount(currPtr->namePtr); - } - nextPtr = currPtr->nextPtr; - ckfree((char *)currPtr); - } -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_EvalArgs() - * - * This procedure invokes a list of (objc,objv) arguments as a - * single command. It is similar to Tcl_EvalObj, but it doesn't - * do any parsing or compilation. It simply treats the first - * argument as a command and invokes that command in the current - * context. - * - * Returns TCL_OK if successful. Otherwise, this procedure returns - * TCL_ERROR along with an error message in the interpreter. - * ------------------------------------------------------------------------ - */ -int -Itcl_EvalArgs( - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result; - Tcl_Command cmd; - int cmdlinec; - Tcl_Obj **cmdlinev; - Tcl_Obj *cmdlinePtr = NULL; - Tcl_CmdInfo infoPtr; - - /* - * Resolve the command by converting it to a CmdName object. - * This caches a pointer to the Command structure for the - * command, so if we need it again, it's ready to use. - */ - cmd = Tcl_GetCommandFromObj(interp, objv[0]); - - cmdlinec = objc; - cmdlinev = (Tcl_Obj **) objv; - - /* - * If the command is still not found, handle it with the - * "unknown" proc. - */ - if (cmd == NULL) { - cmd = Tcl_FindCommand(interp, "unknown", - (Tcl_Namespace *) NULL, /*flags*/ TCL_GLOBAL_ONLY); - - if (cmd == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid command name \"", - Tcl_GetStringFromObj(objv[0], NULL), "\"", NULL); - return TCL_ERROR; - } - - cmdlinePtr = Itcl_CreateArgs(interp, "unknown", objc, objv); - Tcl_ListObjGetElements(NULL, cmdlinePtr, &cmdlinec, &cmdlinev); - } - - /* - * Finally, invoke the command's Tcl_ObjCmdProc. Be careful - * to pass in the proper client data. - */ - Tcl_ResetResult(interp); - result = Tcl_GetCommandInfoFromToken(cmd, &infoPtr); - if (result == 1) { - result = (infoPtr.objProc)(infoPtr.objClientData, interp, - cmdlinec, cmdlinev); - } - - if (cmdlinePtr) { - Tcl_DecrRefCount(cmdlinePtr); - } - return result; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateArgs() - * - * This procedure takes a string and a list of (objc,objv) arguments, - * and glues them together in a single list. This is useful when - * a command word needs to be prepended or substituted into a command - * line before it is executed. The arguments are returned in a single - * list object, and they can be retrieved by calling - * Tcl_ListObjGetElements. When the arguments are no longer needed, - * they should be discarded by decrementing the reference count for - * the list object. - * - * Returns a pointer to the list object containing the arguments. - * ------------------------------------------------------------------------ - */ -Tcl_Obj* -Itcl_CreateArgs( - Tcl_Interp *interp, /* current interpreter */ - const char *string, /* first command word */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int i; - Tcl_Obj *listPtr; - - ItclShowArgs(1, "Itcl_CreateArgs", objc, objv); - listPtr = Tcl_NewListObj(objc+2, NULL); - Tcl_ListObjAppendElement(NULL, listPtr, Tcl_NewStringObj("my", -1)); - Tcl_ListObjAppendElement(NULL, listPtr, Tcl_NewStringObj(string, -1)); - - for (i=0; i < objc; i++) { - Tcl_ListObjAppendElement(NULL, listPtr, objv[i]); - } - return listPtr; -} - -/* - * ------------------------------------------------------------------------ - * ItclEnsembleSubCmd() - * ------------------------------------------------------------------------ - */ - -int -ItclEnsembleSubCmd( - ClientData clientData, - Tcl_Interp *interp, - const char *ensembleName, - int objc, - Tcl_Obj *const *objv, - const char *functionName) -{ - int result; - Tcl_Obj **newObjv; - int isRootEnsemble; - ItclShowArgs(2, functionName, objc, objv); - - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc)); - isRootEnsemble = Itcl_InitRewriteEnsemble(interp, 1, 1, objc, objv); - newObjv[0] = Tcl_NewStringObj("::itcl::builtin::Info", -1); - Tcl_IncrRefCount(newObjv[0]); - if (objc > 1) { - memcpy(newObjv+1, objv+1, sizeof(Tcl_Obj *) * (objc-1)); - } - result = Tcl_EvalObjv(interp, objc, newObjv, TCL_EVAL_INVOKE); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - Itcl_ResetRewriteEnsemble(interp, isRootEnsemble); - return result; -} - - -/* - * ------------------------------------------------------------------------ - * ItclCapitalize() - * ------------------------------------------------------------------------ - */ - -Tcl_Obj * -ItclCapitalize( - const char *str) -{ - Tcl_Obj *objPtr; - char buf[2]; - - sprintf(buf, "%c", toupper(UCHAR(*str))); - buf[1] = '\0'; - objPtr = Tcl_NewStringObj(buf, -1); - Tcl_AppendToObj(objPtr, str+1, -1); - return objPtr; -} -/* - * ------------------------------------------------------------------------ - * DeleteClassDictInfo() - * ------------------------------------------------------------------------ - */ -static int -DeleteClassDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - const char *varName) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - - dictPtr = Tcl_GetVar2Ex(interp, varName, NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", varName, NULL); - return TCL_ERROR; - } - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjRemove(interp, dictPtr, keyPtr) != TCL_OK) { - return TCL_ERROR; - } - Tcl_SetVar2Ex(interp, varName, NULL, dictPtr, 0); - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * AddDictEntry() - * ------------------------------------------------------------------------ - */ -static int -AddDictEntry( - Tcl_Interp *interp, - Tcl_Obj *dictPtr, - const char *keyStr, - Tcl_Obj *valuePtr) -{ - Tcl_Obj *keyPtr; - - if (valuePtr == NULL) { - return TCL_OK; - } - keyPtr = Tcl_NewStringObj(keyStr, -1); - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr) != TCL_OK) { - Tcl_DecrRefCount(keyPtr); - return TCL_ERROR; - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddClassesDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddClassesDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *keyPtr1; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - FOREACH_HASH_DECLS; - ItclHierIter hier; - ItclClass *iclsPtr2; - void *value; - int found; - int newValue1; - int haveHierarchy; - - found = 0; - FOREACH_HASH(keyPtr1, value, &iclsPtr->infoPtr->classTypes) { - if (iclsPtr->flags & PTR2INT(value)) { - found = 1; - break; - } - } - if (! found) { - Tcl_AppendResult(interp, "ItclAddClassesDictInfo bad class ", - "type for class \"", Tcl_GetString(iclsPtr->fullNamePtr), - "\"", NULL); - return TCL_ERROR; - } - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classes", NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classes", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr1, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - newValue1 = 1; - valuePtr1 = Tcl_NewDictObj(); - } - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 != NULL) { - if (Tcl_DictObjRemove(interp, valuePtr1, keyPtr) != TCL_OK) { - return TCL_ERROR; - } - } - valuePtr2 = Tcl_NewDictObj(); - if (AddDictEntry(interp, valuePtr2, "-name", iclsPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-fullname", iclsPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - haveHierarchy = 0; - listPtr = Tcl_NewListObj(0, NULL); - while (iclsPtr2 != NULL) { - haveHierarchy = 1; - if (Tcl_ListObjAppendElement(interp, listPtr, iclsPtr2->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - if (haveHierarchy) { - if (AddDictEntry(interp, valuePtr2, "-heritage", listPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - if (iclsPtr->widgetClassPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-widget", iclsPtr->widgetClassPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - if (iclsPtr->hullTypePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-hulltype", iclsPtr->hullTypePtr) - != TCL_OK) { - return TCL_ERROR; - } - } - if (iclsPtr->typeConstructorPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-typeconstructor", - iclsPtr->typeConstructorPtr) != TCL_OK) { - return TCL_ERROR; - } - } - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - if (Tcl_DictObjPut(interp, dictPtr, keyPtr1, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, ITCL_NAMESPACE"::internal::dicts::classes", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteClassesDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclDeleteClassesDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr; - FOREACH_HASH_DECLS; - void* value; - int found; - - found = 0; - FOREACH_HASH(keyPtr, value, &iclsPtr->infoPtr->classTypes) { - if (iclsPtr->flags & PTR2INT(value)) { - found = 1; - break; - } - } - if (! found) { - Tcl_AppendResult(interp, "ItclDeleteClassesDictInfo bad class ", - "type for class \"", Tcl_GetString(iclsPtr->fullNamePtr), - "\"", NULL); - return TCL_ERROR; - } - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classes", NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classes", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr == NULL) { - /* there seems to have been an error during construction - * and no class has been created so ignore silently */ - return TCL_OK; - } - if (Tcl_DictObjRemove(interp, valuePtr, iclsPtr->fullNamePtr) != TCL_OK) { - return TCL_ERROR; - } - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr) != TCL_OK) { - return TCL_ERROR; - } - Tcl_SetVar2Ex(interp, ITCL_NAMESPACE"::internal::dicts::classes", - NULL, dictPtr, 0); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classOptions"); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classDelegatedOptions"); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classVariables"); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classComponents"); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classFunctions"); - DeleteClassDictInfo(interp, iclsPtr, - ITCL_NAMESPACE"::internal::dicts::classDelegatedFunctions"); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddObjectsDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddObjectsDictInfo( - Tcl_Interp *interp, - ItclObject *ioPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *keyPtr1; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *objPtr; - int newValue1; - - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::objects", NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::objects", NULL); - return TCL_ERROR; - } - keyPtr1 = Tcl_NewStringObj("instances", -1); - if (Tcl_DictObjGet(interp, dictPtr, keyPtr1, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - newValue1 = 1; - valuePtr1 = Tcl_NewDictObj(); - } - keyPtr = ioPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - if (Tcl_DictObjRemove(interp, valuePtr1, keyPtr) != TCL_OK) { - return TCL_ERROR; - } - } - valuePtr2 = Tcl_NewDictObj(); - if (AddDictEntry(interp, valuePtr2, "-name", ioPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-origname", ioPtr->namePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-class", ioPtr->iclsPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr->hullWindowNamePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-hullwindow", - ioPtr->hullWindowNamePtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (AddDictEntry(interp, valuePtr2, "-varns", ioPtr->varNsNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - objPtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - if (AddDictEntry(interp, valuePtr2, "-command", objPtr) != TCL_OK) { - Tcl_DecrRefCount(objPtr); - return TCL_ERROR; - } - keyPtr = ioPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - /* Cannot fail. Screened non-dicts earlier. */ - Tcl_DictObjPut(interp, dictPtr, keyPtr1, valuePtr1); - } else { - /* Don't leak the key val... */ - Tcl_DecrRefCount(keyPtr1); - } - Tcl_SetVar2Ex(interp, ITCL_NAMESPACE"::internal::dicts::objects", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteObjectsDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclDeleteObjectsDictInfo( - Tcl_Interp *interp, - ItclObject *ioPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *keyPtr1; - Tcl_Obj *valuePtr; - Tcl_Obj *valuePtr1; - - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::objects", NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::objects", NULL); - return TCL_ERROR; - } - keyPtr1 = Tcl_NewStringObj("instances", -1); - if (Tcl_DictObjGet(interp, dictPtr, keyPtr1, &valuePtr) != TCL_OK) { - Tcl_DecrRefCount(keyPtr1); - return TCL_ERROR; - } - if (valuePtr == NULL) { - /* looks like no object has been registered yet - * so ignore and return OK */ - Tcl_DecrRefCount(keyPtr1); - return TCL_OK; - } - keyPtr = ioPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr, keyPtr, &valuePtr1) != TCL_OK) { - Tcl_DecrRefCount(keyPtr1); - return TCL_ERROR; - } - if (valuePtr1 == NULL) { - /* looks like the object has not been constructed successfully - * so ignore and return OK */ - Tcl_DecrRefCount(keyPtr1); - return TCL_OK; - } - if (Tcl_DictObjRemove(interp, valuePtr, keyPtr) != TCL_OK) { - Tcl_DecrRefCount(keyPtr1); - return TCL_ERROR; - } - if (Tcl_DictObjPut(interp, dictPtr, keyPtr1, valuePtr) != TCL_OK) { - /* This is very likely impossible. non-dict already screened. */ - Tcl_DecrRefCount(keyPtr1); - return TCL_ERROR; - } - Tcl_DecrRefCount(keyPtr1); - Tcl_SetVar2Ex(interp, ITCL_NAMESPACE"::internal::dicts::objects", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddOptionDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddOptionDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclOption *ioptPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - int newValue1; - - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classOptions", NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classOptions", NULL); - return TCL_ERROR; - } - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = ioptPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - valuePtr2 = Tcl_NewDictObj(); - } - if (AddDictEntry(interp, valuePtr2, "-name", ioptPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioptPtr->fullNamePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-fullname", ioptPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - } - if (AddDictEntry(interp, valuePtr2, "-resource", ioptPtr->resourceNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-class", ioptPtr->classNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (ioptPtr->defaultValuePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-default", - ioptPtr->defaultValuePtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->flags & ITCL_OPTION_READONLY) { - if (AddDictEntry(interp, valuePtr2, "-readonly", - Tcl_NewStringObj("1", -1)) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->cgetMethodPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-cgetmethod", - ioptPtr->cgetMethodPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->cgetMethodVarPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-cgetmethodvar", - ioptPtr->cgetMethodVarPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->configureMethodPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-configuremethod", - ioptPtr->cgetMethodPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->configureMethodVarPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-configuremethodvar", - ioptPtr->configureMethodVarPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->validateMethodPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-validatemethod", - ioptPtr->validateMethodPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (ioptPtr->validateMethodVarPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-validatemethodvar", - ioptPtr->validateMethodVarPtr) != TCL_OK) { - return TCL_ERROR; - } - } - keyPtr = ioptPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, ITCL_NAMESPACE"::internal::dicts::classOptions", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddDelegatedOptionDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddDelegatedOptionDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclDelegatedOption *idoPtr) -{ - FOREACH_HASH_DECLS; - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - void *value; - int haveExceptions; - int newValue1; - - keyPtr = iclsPtr->fullNamePtr; - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedOptions", - NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classDelegatedOptions", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = idoPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - valuePtr2 = Tcl_NewDictObj(); - } - if (AddDictEntry(interp, valuePtr2, "-name", idoPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (idoPtr->resourceNamePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-resource", - idoPtr->resourceNamePtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (idoPtr->classNamePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-class", idoPtr->classNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - } - if (idoPtr->icPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-component", - idoPtr->icPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (idoPtr->asPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-as", idoPtr->asPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - listPtr = Tcl_NewListObj(0, NULL); - haveExceptions = 0; - FOREACH_HASH(keyPtr, value, &idoPtr->exceptions) { - if (value == NULL) { - /* FIXME need code here */ - } - haveExceptions = 1; - Tcl_ListObjAppendElement(interp, listPtr, keyPtr); - } - if (haveExceptions) { - if (AddDictEntry(interp, valuePtr2, "-except", listPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - keyPtr = idoPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedOptions", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddClassComponentDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddClassComponentDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclComponent *icPtr) -{ - FOREACH_HASH_DECLS; - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - void *value; - int newValue1; - - keyPtr = iclsPtr->fullNamePtr; - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classComponents", - NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classComponents", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = icPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - valuePtr2 = Tcl_NewDictObj(); - } - if (AddDictEntry(interp, valuePtr2, "-name", icPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-variable", icPtr->ivPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (icPtr->flags & ITCL_COMPONENT_INHERIT) { - if (AddDictEntry(interp, valuePtr2, "-inherit", - Tcl_NewStringObj("1", -1)) != TCL_OK) { - return TCL_ERROR; - } - } - if (icPtr->flags & ITCL_COMPONENT_PUBLIC) { - if (AddDictEntry(interp, valuePtr2, "-public", - Tcl_NewStringObj("1", -1)) != TCL_OK) { - return TCL_ERROR; - } - } - if (icPtr->haveKeptOptions) { - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH(keyPtr, value, &icPtr->keptOptions) { - if (value == NULL) { - /* FIXME need code here */ - } - Tcl_ListObjAppendElement(interp, listPtr, keyPtr); - } - if (AddDictEntry(interp, valuePtr2, "-keptoptions", listPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - keyPtr = icPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classComponents", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddClassVariableDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddClassVariableDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclVariable *ivPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - const char *cp; - int haveFlags; - int newValue1; - - keyPtr = iclsPtr->fullNamePtr; - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classVariables", - NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classVariables", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = ivPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - valuePtr2 = Tcl_NewDictObj(); - } - if (AddDictEntry(interp, valuePtr2, "-name", ivPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-fullname", ivPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - if (ivPtr->init != NULL) { - if (AddDictEntry(interp, valuePtr2, "-init", ivPtr->init) - != TCL_OK) { - return TCL_ERROR; - } - } - if (ivPtr->arrayInitPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-arrayinit", ivPtr->arrayInitPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - cp = Itcl_ProtectionStr(ivPtr->protection); - if (AddDictEntry(interp, valuePtr2, "-protection", Tcl_NewStringObj(cp, -1)) - != TCL_OK) { - return TCL_ERROR; - } - cp = "variable"; - if (ivPtr->flags & ITCL_COMMON) { - cp = "common"; - } - if (ivPtr->flags & ITCL_VARIABLE) { - cp = "variable"; - } - if (ivPtr->flags & ITCL_TYPE_VARIABLE) { - cp = "typevariable"; - } - if (AddDictEntry(interp, valuePtr2, "-type", Tcl_NewStringObj(cp, -1)) - != TCL_OK) { - return TCL_ERROR; - } - haveFlags = 0; - listPtr = Tcl_NewListObj(0, NULL); - if (ivPtr->flags & ITCL_THIS_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, Tcl_NewStringObj("this", -1)); - } - if (ivPtr->flags & ITCL_SELF_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, Tcl_NewStringObj("self", -1)); - } - if (ivPtr->flags & ITCL_SELFNS_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("selfns", -1)); - } - if (ivPtr->flags & ITCL_WIN_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, Tcl_NewStringObj("win", -1)); - } - if (ivPtr->flags & ITCL_COMPONENT_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("component", -1)); - } - if (ivPtr->flags & ITCL_OPTIONS_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("itcl_options", -1)); - } - if (ivPtr->flags & ITCL_HULL_VAR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("itcl_hull", -1)); - } - if (ivPtr->flags & ITCL_OPTION_READONLY) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("option_read_only", -1)); - } - if (haveFlags) { - if (AddDictEntry(interp, valuePtr2, "-flags", listPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - if (ivPtr->codePtr != NULL) { - if (ivPtr->codePtr->bodyPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-code", - ivPtr->codePtr->bodyPtr) != TCL_OK) { - return TCL_ERROR; - } - } - } - keyPtr = ivPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classVariables", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddClassFunctionDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddClassFunctionDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclMemberFunc *imPtr) -{ - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - const char *cp; - int haveFlags; - int newValue1; - - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classFunctions", - NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classFunctions", NULL); - return TCL_ERROR; - } - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = imPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 != NULL) { - Tcl_DictObjRemove(interp, valuePtr1, keyPtr); - } - valuePtr2 = Tcl_NewDictObj(); - if (AddDictEntry(interp, valuePtr2, "-name", imPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (AddDictEntry(interp, valuePtr2, "-fullname", imPtr->fullNamePtr) - != TCL_OK) { - return TCL_ERROR; - } - cp = ""; - if (imPtr->protection == ITCL_PUBLIC) { - cp = "public"; - } - if (imPtr->protection == ITCL_PROTECTED) { - cp = "protected"; - } - if (imPtr->protection == ITCL_PRIVATE) { - cp = "private"; - } - if (AddDictEntry(interp, valuePtr2, "-protection", Tcl_NewStringObj(cp, -1)) - != TCL_OK) { - return TCL_ERROR; - } - cp = ""; - if (imPtr->flags & ITCL_COMMON) { - cp = "common"; - } - if (imPtr->flags & ITCL_METHOD) { - cp = "method"; - } - if (imPtr->flags & ITCL_TYPE_METHOD) { - cp = "typemethod"; - } - if (AddDictEntry(interp, valuePtr2, "-type", Tcl_NewStringObj(cp, -1)) - != TCL_OK) { - return TCL_ERROR; - } - haveFlags = 0; - listPtr = Tcl_NewListObj(0, NULL); - if (imPtr->flags & ITCL_CONSTRUCTOR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("constructor", -1)); - } - if (imPtr->flags & ITCL_DESTRUCTOR) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("destructor", -1)); - } - if (imPtr->flags & ITCL_ARG_SPEC) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("have_args", -1)); - } - if (imPtr->flags & ITCL_BODY_SPEC) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("have_body", -1)); - } - if (haveFlags) { - if (AddDictEntry(interp, valuePtr2, "-flags", listPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - if (imPtr->codePtr != NULL) { - if (imPtr->codePtr->bodyPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-body", - imPtr->codePtr->bodyPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (imPtr->codePtr->argumentPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-args", - imPtr->codePtr->argumentPtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (imPtr->codePtr->usagePtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-usage", - imPtr->codePtr->usagePtr) != TCL_OK) { - return TCL_ERROR; - } - } - haveFlags = 0; - listPtr = Tcl_NewListObj(0, NULL); - if (imPtr->codePtr->flags & ITCL_BUILTIN) { - haveFlags = 1; - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("builtin", -1)); - } - if (haveFlags) { - if (AddDictEntry(interp, valuePtr2, "-codeflags", listPtr) - != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - } - keyPtr = imPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classFunctions", - NULL, dictPtr, 0); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclAddClassDelegatedFunctionDictInfo() - * ------------------------------------------------------------------------ - */ -int -ItclAddClassDelegatedFunctionDictInfo( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclDelegatedFunction *idmPtr) -{ - FOREACH_HASH_DECLS; - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr1; - Tcl_Obj *valuePtr2; - Tcl_Obj *listPtr; - void *value; - int haveExceptions; - int newValue1; - - keyPtr = iclsPtr->fullNamePtr; - dictPtr = Tcl_GetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedFunctions", - NULL, 0); - if (dictPtr == NULL) { - Tcl_AppendResult(interp, "cannot get dict ", ITCL_NAMESPACE, - "::internal::dicts::classDelegatedFunctions", NULL); - return TCL_ERROR; - } - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - newValue1 = 0; - if (valuePtr1 == NULL) { - valuePtr1 = Tcl_NewDictObj(); - newValue1 = 1; - } - keyPtr = idmPtr->namePtr; - if (Tcl_DictObjGet(interp, valuePtr1, keyPtr, &valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (valuePtr2 == NULL) { - valuePtr2 = Tcl_NewDictObj(); - } - if (AddDictEntry(interp, valuePtr2, "-name", idmPtr->namePtr) != TCL_OK) { - return TCL_ERROR; - } - if (idmPtr->icPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-component", - idmPtr->icPtr->ivPtr->fullNamePtr) != TCL_OK) { - return TCL_ERROR; - } - } - if (idmPtr->asPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-as", idmPtr->asPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - if (idmPtr->usingPtr != NULL) { - if (AddDictEntry(interp, valuePtr2, "-using", idmPtr->usingPtr) - != TCL_OK) { - return TCL_ERROR; - } - } - haveExceptions = 0; - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH(keyPtr, value, &idmPtr->exceptions) { - if (value == NULL) { - /* FIXME need code here */ - } - haveExceptions = 1; - if (Tcl_ListObjAppendElement(interp, listPtr, keyPtr) != TCL_OK) { - return TCL_ERROR; - } - } - - if (haveExceptions) { - if (AddDictEntry(interp, valuePtr2, "-except", listPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - Tcl_DecrRefCount(listPtr); - } - keyPtr = idmPtr->namePtr; - if (Tcl_DictObjPut(interp, valuePtr1, keyPtr, valuePtr2) != TCL_OK) { - return TCL_ERROR; - } - if (newValue1) { - keyPtr = iclsPtr->fullNamePtr; - if (Tcl_DictObjPut(interp, dictPtr, keyPtr, valuePtr1) != TCL_OK) { - return TCL_ERROR; - } - } - Tcl_SetVar2Ex(interp, - ITCL_NAMESPACE"::internal::dicts::classDelegatedFunctions", - NULL, dictPtr, 0); - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclInfo.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclInfo.c deleted file mode 100644 index bbd7513..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclInfo.c +++ /dev/null @@ -1,5327 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * These procedures handle built-in class methods, including the - * "isa" method (to query hierarchy info) and the "info" method - * (to query class/object data). - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -static Tcl_ObjCmdProc Itcl_BiInfoClassOptionsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoComponentsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDefaultCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedCmd; -static Tcl_ObjCmdProc Itcl_BiInfoExtendedClassCmd; -static Tcl_ObjCmdProc Itcl_BiInfoInstancesCmd; -static Tcl_ObjCmdProc Itcl_BiInfoHullTypeCmd; -static Tcl_ObjCmdProc Itcl_BiInfoMethodCmd; -static Tcl_ObjCmdProc Itcl_BiInfoMethodsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoOptionsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypeCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypeMethodCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypeMethodsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypesCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypeVarsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoTypeVariableCmd; -static Tcl_ObjCmdProc Itcl_BiInfoVariablesCmd; -static Tcl_ObjCmdProc Itcl_BiInfoWidgetadaptorCmd; -static Tcl_ObjCmdProc Itcl_BiInfoWidgetCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedOptionsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedMethodsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedTypeMethodsCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedOptionCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedMethodCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedTypeMethodCmd; -static Tcl_ObjCmdProc Itcl_BiInfoDelegatedUnknownCmd; -static Tcl_ObjCmdProc Itcl_BiInfoContextCmd; - -typedef struct InfoMethod { - const char* name; /* method name */ - const char* usage; /* string describing usage */ - Tcl_ObjCmdProc *proc; /* implementation C proc */ - int flags; /* which class commands have it */ -} InfoMethod; - -static const InfoMethod InfoMethodList[] = { - { "args", - "procname", - Itcl_BiInfoArgsCmd, - ITCL_CLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "body", - "procname", - Itcl_BiInfoBodyCmd, - ITCL_CLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "class", - "", - Itcl_BiInfoClassCmd, - ITCL_CLASS|ITCL_WIDGET|ITCL_ECLASS - }, - { "classoptions", - "?pattern?", - Itcl_BiInfoClassOptionsCmd, - ITCL_ECLASS - }, - { "component", - "?name? ?-inherit? ?-value?", - Itcl_BiInfoComponentCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "context", - "", - Itcl_BiInfoContextCmd, - ITCL_ECLASS - }, - { "components", - "?pattern?", - Itcl_BiInfoComponentsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "default", - "method aname varname", - Itcl_BiInfoDefaultCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "delegated", - "?name? ?-inherit? ?-value?", - Itcl_BiInfoDelegatedCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "extendedclass", - "", - Itcl_BiInfoExtendedClassCmd, - ITCL_ECLASS - }, - { "function", - "?name? ?-protection? ?-type? ?-name? ?-args? ?-body?", - Itcl_BiInfoFunctionCmd, - ITCL_CLASS|ITCL_ECLASS - }, - { "heritage", - "", - Itcl_BiInfoHeritageCmd, - ITCL_CLASS|ITCL_WIDGET|ITCL_ECLASS - }, - { "hulltype", - "", - Itcl_BiInfoHullTypeCmd, - ITCL_WIDGET - }, - { "hulltypes", - "?pattern?", - Itcl_BiInfoUnknownCmd, - ITCL_WIDGETADAPTOR|ITCL_WIDGET - }, - { "inherit", - "", - Itcl_BiInfoInheritCmd, - ITCL_CLASS|ITCL_WIDGET|ITCL_ECLASS - }, - { "instances", - "?pattern?", - Itcl_BiInfoInstancesCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET - }, - { "method", - "?name? ?-protection? ?-type? ?-name? ?-args? ?-body?", - Itcl_BiInfoMethodCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "methods", - "?pattern?", - Itcl_BiInfoMethodsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "option", - "?name? ?-protection? ?-resource? ?-class? ?-name? ?-default? \ -?-cgetmethod? ?-configuremethod? ?-validatemethod? \ -?-cgetmethodvar? ?-configuremethodvar? ?-validatemethodvar? \ -?-value?", - Itcl_BiInfoOptionCmd, - ITCL_WIDGET|ITCL_ECLASS - }, - { "options", - "?pattern?", - Itcl_BiInfoOptionsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "type", - "", - Itcl_BiInfoTypeCmd, - ITCL_TYPE|ITCL_WIDGET|ITCL_ECLASS - }, - { "typemethod", - "?name? ?-protection? ?-type? ?-name? ?-args? ?-body?", - Itcl_BiInfoTypeMethodCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "typemethods", - "?pattern?", - Itcl_BiInfoTypeMethodsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "types", - "?pattern?", - Itcl_BiInfoTypesCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "typevariable", - "?name? ?-protection? ?-type? ?-name? ?-init? ?-value?", - Itcl_BiInfoTypeVariableCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "typevars", - "?pattern?", - Itcl_BiInfoTypeVarsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "variable", - "?name? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config?", - Itcl_BiInfoVariableCmd, - ITCL_CLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "variables", - "?pattern?", - Itcl_BiInfoVariablesCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "vars", - "?pattern?", - Itcl_BiInfoVarsCmd, - ITCL_CLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "widget", - "", - Itcl_BiInfoWidgetCmd, - ITCL_WIDGET - }, - { "widgets", - "?pattern?", - Itcl_BiInfoUnknownCmd, - ITCL_WIDGET - }, - { "widgetclasses", - "?pattern?", - Itcl_BiInfoUnknownCmd, - ITCL_WIDGET - }, - { "widgetadaptor", - "", - Itcl_BiInfoWidgetadaptorCmd, - ITCL_WIDGETADAPTOR - }, - { "widgetadaptors", - "?pattern?", - Itcl_BiInfoUnknownCmd, - ITCL_WIDGETADAPTOR - }, - { NULL, - NULL, - NULL, - 0 - } -}; - -struct NameProcMap2 { - const char* name; /* method name */ - const char* usage; /* string describing usage */ - Tcl_ObjCmdProc *proc; /* implementation C proc */ - int flags; /* which class commands have it */ -}; - -static const struct NameProcMap2 infoCmdsDelegated2[] = { - { "::itcl::builtin::Info::delegated::methods", - "?pattern?", - Itcl_BiInfoDelegatedMethodsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::typemethods", - "?pattern?", - Itcl_BiInfoDelegatedTypeMethodsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::options", - "?pattern?", - Itcl_BiInfoDelegatedOptionsCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::method", - "methodName", - Itcl_BiInfoDelegatedMethodCmd, - ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::typemethod", - "methodName", - Itcl_BiInfoDelegatedTypeMethodCmd, - ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::option", - "methodName", - Itcl_BiInfoDelegatedOptionCmd, - ITCL_ECLASS - }, - { "::itcl::builtin::Info::delegated::unknown", - "", - Itcl_BiInfoDelegatedUnknownCmd, - ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS - }, - { NULL, NULL, NULL, 0 } -}; - -static void ItclGetInfoUsage(Tcl_Interp *interp, Tcl_Obj*objPtr, - ItclObjectInfo *infoPtr, ItclClass *iclsPtr); - - -/* - * ------------------------------------------------------------------------ - * ItclInfoInit() - * - * Creates a namespace full of built-in methods/procs for [incr Tcl] - * classes. This includes things like the "info" - * for querying class info. Usually invoked by Itcl_Init() when - * [incr Tcl] is first installed into an interpreter. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ - -static int -InfoGutsFinish( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_CallFrame *framePtr = (Tcl_CallFrame *) data[0]; - ItclObjectInfo *infoPtr = (ItclObjectInfo *) data[1]; - ItclCallContext *cPtr = (ItclCallContext *) data[2]; - ItclCallContext *popped; - - Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, - (char *) framePtr); - - Itcl_Stack *stackPtr = (Itcl_Stack *) Tcl_GetHashValue(hPtr); - - popped = Itcl_PopStack(stackPtr); - - if (Itcl_GetStackSize(stackPtr) == 0) { - Itcl_DeleteStack(stackPtr); - ckfree((char *)stackPtr); - Tcl_DeleteHashEntry(hPtr); - } - - if (cPtr != popped) { - Tcl_Panic("Context stack mismatch!"); - } - ckfree((char *) cPtr); - - return result; -} - -int -ItclInfoGuts( - ItclObject *ioPtr, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const objv[]) -{ - ItclObjectInfo *infoPtr = ioPtr->infoPtr; - Tcl_CmdInfo info; - ItclCallContext *cPtr; - Tcl_CallFrame *framePtr; - Tcl_HashEntry *hPtr; - Itcl_Stack *stackPtr; - int new; - - if (objc == 2) { - /* - * No subcommand passed. Give good usage message. NOT the - * default message of a Tcl ensemble. - */ - - Tcl_Obj *objPtr = Tcl_NewStringObj( - "wrong # args: should be one of...\n", -1); - ItclGetInfoUsage(interp, objPtr, infoPtr, ioPtr->iclsPtr); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - - framePtr = Itcl_GetUplevelCallFrame(interp, 0); - - hPtr = Tcl_CreateHashEntry(&infoPtr->frameContext, (char *)framePtr, &new); - if (new) { - stackPtr = (Itcl_Stack *) ckalloc(sizeof(Itcl_Stack)); - Itcl_InitStack(stackPtr); - Tcl_SetHashValue(hPtr, stackPtr); - } else { - stackPtr = (Itcl_Stack *) Tcl_GetHashValue(hPtr); - } - - cPtr = (ItclCallContext *) ckalloc(sizeof(ItclCallContext)); - cPtr->objectFlags = ITCL_OBJECT_ROOT_METHOD; - cPtr->nsPtr = NULL; - cPtr->ioPtr = ioPtr; - cPtr->imPtr = NULL; - cPtr->refCount = 1; - - Itcl_PushStack(cPtr, stackPtr); - - Tcl_NRAddCallback(interp, InfoGutsFinish, framePtr, infoPtr, cPtr, NULL); - Tcl_GetCommandInfoFromToken(infoPtr->infoCmd, &info); - return Tcl_NRCallObjProc(interp, info.objProc, info.objClientData, - objc-1, objv+1); -} - -static int -NRInfoWrap( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const objv[]) -{ - Tcl_CmdInfo info; - Tcl_Command token = (Tcl_Command) clientData; - - if (objc == 1) { - /* - * No subcommand passed. Give good usage message. NOT the - * default message of a Tcl ensemble. - */ - - ItclObjectInfo *infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - Tcl_Obj *objPtr = Tcl_NewStringObj( - "wrong # args: should be one of...\n", -1); - ItclGetInfoUsage(interp, objPtr, infoPtr, NULL); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - - /* Have a subcommand. Pass on to the ensemble */ - - /* - * WARNING! WARNING! WARNING! - * We are doing NOTHING to guarantee that the command corresponding to - * token has not been deleted. If it is deleted, this will fail very - * badly. Another pass to plug up dependencies like this is in order. - * I'm not bothering now because the code is already overflowing with - * worse uncontrolled dependencies. I'll clean the windows sometime - * later when the cracks in the foundation are filled in. - */ - Tcl_GetCommandInfoFromToken(token, &info); - return Tcl_NRCallObjProc(interp, info.objProc, info.objClientData, - objc, objv); -} - -static int -InfoWrap( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const objv[]) -{ - return Tcl_NRCallObjProc(interp, NRInfoWrap, clientData, objc, objv); -} - -static void -InfoCmdDelete( - ClientData clientData, - Tcl_Interp *interp, - const char *oldName, - const char *newName, - int flags) -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo *)clientData; - - infoPtr->infoCmd = NULL; -} - -int -ItclInfoInit( - Tcl_Interp *interp, /* current interpreter */ - ItclObjectInfo *infoPtr) -{ - Tcl_Namespace *nsPtr; - Tcl_Command token; - Tcl_CmdInfo info; - Tcl_Obj *unkObjPtr; - Tcl_Obj *ensObjPtr; - int result; - int i; - - /* - * Build the ensemble used to implement [info]. - */ - - nsPtr = Tcl_CreateNamespace(interp, "::itcl::builtin::Info", NULL, NULL); - if (nsPtr == NULL) { - Tcl_Panic("ITCL: error in creating namespace: ::itcl::builtin::Info \n"); - } - if (infoPtr->infoCmd) { - Tcl_Panic("Double init of info ensemble"); - } - token = Tcl_CreateEnsemble(interp, nsPtr->fullName, nsPtr, - TCL_ENSEMBLE_PREFIX); - Tcl_TraceCommand(interp, nsPtr->fullName, TCL_TRACE_DELETE, - InfoCmdDelete, (ClientData) infoPtr); - infoPtr->infoCmd = token; - token = Tcl_NRCreateCommand(interp, "::itcl::builtin::info", InfoWrap, - NRInfoWrap, token, NULL); - Tcl_GetCommandInfoFromToken(token, &info); - - /* - * Make the C implementation of the "info" ensemble available as - * a method body. This makes all [$object info] become the - * equivalent of [::itcl::builtin::Info] without any need for - * tailcall to restore the right frame [87a1bc6e82]. - */ - Itcl_RegisterObjC(interp, "itcl-builtin-info", info.objProc, - info.objClientData, NULL); - - Tcl_Export(interp, nsPtr, "[a-z]*", 1); - ensObjPtr = Tcl_NewStringObj("::itcl::builtin::Info", -1); - - for (i=0 ; InfoMethodList[i].name!=NULL ; i++) { - Tcl_Obj *cmdObjPtr = Tcl_DuplicateObj(ensObjPtr); - - Tcl_AppendToObj(cmdObjPtr, "::", 2); - Tcl_AppendToObj(cmdObjPtr, InfoMethodList[i].name, -1); - Tcl_CreateObjCommand(interp, Tcl_GetString(cmdObjPtr), - InfoMethodList[i].proc, infoPtr, NULL); - Tcl_DecrRefCount(cmdObjPtr); - } - unkObjPtr = Tcl_NewStringObj("::itcl::builtin::Info::unknown", -1); - Tcl_CreateObjCommand(interp, Tcl_GetString(unkObjPtr), - Itcl_BiInfoUnknownCmd, infoPtr, NULL); - if (Tcl_SetEnsembleUnknownHandler(NULL, - Tcl_FindEnsemble(interp, ensObjPtr, TCL_LEAVE_ERR_MSG), - unkObjPtr) != TCL_OK) { - Tcl_DecrRefCount(unkObjPtr); - Tcl_DecrRefCount(ensObjPtr); - return TCL_ERROR; - } - Tcl_DecrRefCount(ensObjPtr); - - /* - * Build the ensemble used to implement [info delegated]. - */ - - nsPtr = Tcl_CreateNamespace(interp, "::itcl::builtin::Info::delegated", - NULL, NULL); - if (nsPtr == NULL) { - Tcl_Panic("ITCL: error in creating namespace: ::itcl::builtin::Info::delegated \n"); - } - Tcl_CreateEnsemble(interp, nsPtr->fullName, nsPtr, - TCL_ENSEMBLE_PREFIX); - Tcl_Export(interp, nsPtr, "[a-z]*", 1); - for (i=0 ; infoCmdsDelegated2[i].name!=NULL ; i++) { - Tcl_CreateObjCommand(interp, infoCmdsDelegated2[i].name, - infoCmdsDelegated2[i].proc, infoPtr, NULL); - } - ensObjPtr = Tcl_NewStringObj("::itcl::builtin::Info::delegated", - -1); - unkObjPtr = Tcl_NewStringObj( - "::itcl::builtin::Info::delegated::unknown", -1); - result = TCL_OK; - if (Tcl_SetEnsembleUnknownHandler(NULL, - Tcl_FindEnsemble(interp, ensObjPtr, TCL_LEAVE_ERR_MSG), - unkObjPtr) != TCL_OK) { - result = TCL_ERROR; - } - Tcl_DecrRefCount(ensObjPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclGetInfoUsage() - * - * ------------------------------------------------------------------------ - */ -void -ItclGetInfoUsage( - Tcl_Interp *interp, - Tcl_Obj *objPtr, /* returns: summary of usage info */ - ItclObjectInfo *infoPtr, - ItclClass *iclsPtr) -{ - const char *spaces = " "; - int i; - - ItclObject *ioPtr; - if (iclsPtr == NULL) { - if (TCL_ERROR == Itcl_GetContext(interp, &iclsPtr, &ioPtr)) { - return; - } - } - for (i=0; InfoMethodList[i].name != NULL; i++) { - if (strcmp(InfoMethodList[i].name, "vars") == 0) { - /* we don't report that, as it is a special case - * it is only adding the protected and private commons - * to the ::info vars command */ - continue; - } - if (iclsPtr->flags & InfoMethodList[i].flags) { - Tcl_AppendToObj(objPtr, spaces, -1); - Tcl_AppendToObj(objPtr, "info ", -1); - Tcl_AppendToObj(objPtr, InfoMethodList[i].name, -1); - if (strlen(InfoMethodList[i].usage) > 0) { - Tcl_AppendToObj(objPtr, " ", -1); - Tcl_AppendToObj(objPtr, InfoMethodList[i].usage, -1); - } - spaces = "\n "; - } - } - Tcl_AppendToObj(objPtr, - "\n...and others described on the man page", -1); -} - -/* - * ------------------------------------------------------------------------ - * ItclGetInfoDelegatedUsage() - * - * ------------------------------------------------------------------------ - */ -static void -ItclGetInfoDelegatedUsage( - Tcl_Interp *interp, - Tcl_Obj *objPtr, /* returns: summary of usage info */ - ItclObjectInfo *infoPtr) -{ - ItclClass *iclsPtr; - const char *name; - const char *lastName; - const char *spaces = " "; - - int i; - - ItclObject *ioPtr; - if (TCL_ERROR == Itcl_GetContext(interp, &iclsPtr, &ioPtr)) { - return; - } - for (i=0; infoCmdsDelegated2[i].name != NULL; i++) { - name = infoCmdsDelegated2[i].name; - lastName = name; - while (name != NULL) { - name = strstr(name, "::"); - if (name == NULL) { - break; - } - name += 2; - lastName = name; - } - name = lastName; - if (strcmp(name, "unknown") == 0) { - /* we don't report that, as it is a special case */ - continue; - } - if (iclsPtr->flags & infoCmdsDelegated2[i].flags) { - Tcl_AppendToObj(objPtr, spaces, -1); - Tcl_AppendToObj(objPtr, "info ", -1); - Tcl_AppendToObj(objPtr, name, -1); - if (strlen(infoCmdsDelegated2[i].usage) > 0) { - Tcl_AppendToObj(objPtr, " ", -1); - Tcl_AppendToObj(objPtr, infoCmdsDelegated2[i].usage, -1); - } - spaces = "\n "; - } - } - Tcl_AppendToObj(objPtr, - "\n...and others described on the man page", -1); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoClassCmd() - * - * Returns information regarding the class for an object. This command - * can be invoked with or without an object context: - * - * <objName> info class <= returns most-specific class name - * info class <= returns active namespace name - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoClassCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNs = NULL; - ItclClass *contextIclsPtr = NULL; - ItclObject *contextIoPtr; - - char *name; - - ItclShowArgs(1, "Itcl_BiInfoClassCmd", objc, objv); - if (objc != 1) { - /* TODO: convert to NR-enabled fallback to [::info] */ - Tcl_WrongNumArgs(interp, 1, objv, NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - /* try it the hard way */ - ClientData clientData; - ItclObjectInfo *infoPtr; - Tcl_Object oPtr; - clientData = Itcl_GetCallFrameClientData(interp); - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject(clientData); - contextIoPtr = Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - contextIclsPtr = contextIoPtr->iclsPtr; - } - if ((contextIoPtr == NULL) || (contextIclsPtr == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " \ - "\n namespace eval className { info class }", -1)); - return TCL_ERROR; - } - } - - /* - * If there is an object context, then return the most-specific - * class for the object. Otherwise, return the class namespace - * name. Use normal class names when possible. - */ - if (contextIoPtr) { - contextNs = contextIoPtr->iclsPtr->nsPtr; - } else { - assert(contextIclsPtr != NULL); - assert(contextIclsPtr->nsPtr != NULL); - contextNs = contextIclsPtr->nsPtr; - } - - assert(contextNs); - - name = contextNs->fullName; - - Tcl_SetObjResult(interp, Tcl_NewStringObj(name, -1)); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoClassOptionsCmd() - * - * Returns information regarding the options for a class. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoClassOptionsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Obj *listPtr; - Tcl_Obj *listPtr2; - Tcl_Obj *objPtr; - Tcl_Obj **lObjv; - Tcl_HashTable *tablePtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclOption *ioptPtr; - ItclDelegatedOption *idoPtr; - const char *name; - const char *val; - const char *pattern; - int lObjc; - int result; - int i; - - ItclShowArgs(1, "Itcl_BiInfoClassOptionsCmd", objc, objv); - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info options ", - "?pattern?", NULL); - return TCL_ERROR; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - tablePtr = &iclsPtr->options; - FOREACH_HASH_VALUE(ioptPtr, tablePtr) { - name = Tcl_GetString(ioptPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(ioptPtr->namePtr), -1)); - } - } - tablePtr = &iclsPtr->delegatedOptions; - FOREACH_HASH_VALUE(idoPtr, tablePtr) { - name = Tcl_GetString(idoPtr->namePtr); - if (strcmp(name, "*") != 0) { - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(idoPtr->namePtr), -1)); - } - } else { - if (idoPtr->icPtr == NULL) { - Tcl_AppendResult(interp, "component \"", - Tcl_GetString(idoPtr->namePtr), - "\" is not initialized", NULL); - return TCL_ERROR; - } - val = ItclGetInstanceVar(interp, - Tcl_GetString(idoPtr->icPtr->namePtr), - NULL, ioPtr, ioPtr->iclsPtr); - if ((val != NULL) && (strlen(val) != 0)) { - objPtr = Tcl_NewStringObj(val, -1); - Tcl_AppendToObj(objPtr, " configure", -1); - result = Tcl_EvalObjEx(interp, objPtr, 0); - if (result != TCL_OK) { - return TCL_ERROR; - } - listPtr2 = Tcl_GetObjResult(interp); - Tcl_ListObjGetElements(interp, listPtr2, &lObjc, &lObjv); - for (i = 0; i < lObjc; i++) { - Tcl_ListObjIndex(interp, lObjv[i], 0, &objPtr); - hPtr2 = Tcl_FindHashEntry(&idoPtr->exceptions, - (char *)objPtr); - if (hPtr2 == NULL) { - name = Tcl_GetString(objPtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - } - } - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoContextCmd() - * - * Returns information regarding the context object and class. This command - * can only be invoked with an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoContextCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - ItclObject *ioPtr = NULL; - ItclClass *iclsPtr; - - ItclShowArgs(1, "Itcl_BiInfoContextCmd", objc, objv); - iclsPtr = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr == NULL) { - Tcl_AppendResult(interp, "cannot get object context ", (char*)NULL); - return TCL_ERROR; - } - listPtr = Tcl_NewListObj(0, NULL); - objPtr = Tcl_NewStringObj(Tcl_GetString(iclsPtr->namePtr), -1); - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - objPtr = Tcl_NewStringObj(Tcl_GetString(ioPtr->namePtr), -1); - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoInheritCmd() - * - * Returns the list of base classes for the current class context. - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoInheritCmd( - ClientData clientdata, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr = NULL; - ItclObject *contextIoPtr = NULL; - Itcl_ListElem *elem; - Tcl_Obj *listPtr; - - ItclShowArgs(2, "Itcl_BiInfoInheritCmd", objc, objv); - if (objc != 1) { - Tcl_WrongNumArgs(interp, 1, objv, NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info inherit }", -1)); - return TCL_ERROR; - } - - /* - * Return the list of base classes. - */ - - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - elem = Itcl_FirstListElem(&contextIclsPtr->bases); - while (elem) { - Tcl_Obj *objPtr; - ItclClass *iclsPtr = (ItclClass*)Itcl_GetListValue(elem); - objPtr = Tcl_NewStringObj(iclsPtr->nsPtr->fullName, -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - elem = Itcl_NextListElem(elem); - } - - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoHeritageCmd() - * - * Returns the entire derivation hierarchy for this class, presented - * in the order that classes are traversed for finding data members - * and member functions. - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoHeritageCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr = NULL; - ItclObject *contextIoPtr = NULL; - ItclHierIter hier; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - ItclClass *iclsPtr; - - ItclShowArgs(2, "Itcl_BiInfoHeritageCmd", objc, objv); - if (objc != 1) { - Tcl_WrongNumArgs(interp, 1, objv, NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info heritage }", -1)); - return TCL_ERROR; - } - - /* - * Traverse through the derivation hierarchy and return - * base class names. - */ - listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - if (iclsPtr->nsPtr == NULL) { - Tcl_AppendResult(interp, "ITCL: iclsPtr->nsPtr == NULL", - Tcl_GetString(iclsPtr->fullNamePtr), NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(iclsPtr->nsPtr->fullName, -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr); - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoFunctionCmd() - * - * Returns information regarding class member functions (methods/procs). - * Handles the following syntax: - * - * info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body? - * - * If the ?cmdName? is not specified, then a list of all known - * command members is returned. Otherwise, the information for - * a specific command is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoFunctionCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - char *cmdName = NULL; - Tcl_Obj *resultPtr = NULL; - Tcl_Obj *objPtr = NULL; - - static const char *options[] = { - "-args", "-body", "-name", "-protection", "-type", - (char*)NULL - }; - enum BIfIdx { - BIfArgsIdx, BIfBodyIdx, BIfNameIdx, BIfProtectIdx, BIfTypeIdx - } *iflist, iflistStorage[5]; - - static enum BIfIdx DefInfoFunction[5] = { - BIfProtectIdx, - BIfTypeIdx, - BIfNameIdx, - BIfArgsIdx, - BIfBodyIdx - }; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - ItclClass *iclsPtr; - int i; - int result; - const char *val; - Tcl_HashSearch place; - Tcl_HashEntry *entry; - ItclMemberFunc *imPtr; - ItclMemberCode *mcode; - ItclHierIter hier; - - ItclShowArgs(2, "Itcl_InfoFunctionCmd", objc, objv); - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info function ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - cmdName = Tcl_GetString(*objv); - objc--; objv++; - } - - /* - * Return info for a specific command. - */ - if (cmdName) { - ItclCmdLookup *clookup; - objPtr = Tcl_NewStringObj(cmdName, -1); - entry = Tcl_FindHashEntry(&contextIclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - objPtr = NULL; - if (entry == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a member function in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - imPtr = clookup->imPtr; - mcode = imPtr->codePtr; - - /* - * By default, return everything. - */ - if (objc == 0) { - objc = 5; - iflist = DefInfoFunction; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - iflist = &iflistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&iflist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (iflist[i]) { - case BIfArgsIdx: - if (mcode && mcode->argListPtr) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - if ((imPtr->flags & ITCL_ARG_SPEC) != 0) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - } - break; - - case BIfBodyIdx: - if (mcode && Itcl_IsMemberCodeImplemented(mcode)) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->bodyPtr), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - break; - - case BIfNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - break; - - case BIfProtectIdx: - val = Itcl_ProtectionStr(imPtr->protection); - objPtr = Tcl_NewStringObj(val, -1); - break; - - case BIfTypeIdx: - val = ((imPtr->flags & ITCL_COMMON) != 0) - ? "proc" : "method"; - objPtr = Tcl_NewStringObj(val, -1); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available commands. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - entry = Tcl_FirstHashEntry(&iclsPtr->functions, &place); - while (entry) { - int useIt = 1; - - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(entry); - if (imPtr->codePtr && (imPtr->codePtr->flags & ITCL_BUILTIN)) { - if (strcmp(Tcl_GetString(imPtr->namePtr), "info") == 0) { - useIt = 0; - } - if (strcmp(Tcl_GetString(imPtr->namePtr), "setget") == 0) { - if (!(imPtr->iclsPtr->flags & ITCL_ECLASS)) { - useIt = 0; - } - } - if (strcmp(Tcl_GetString(imPtr->namePtr), - "installcomponent") == 0) { - if (!(imPtr->iclsPtr->flags & - (ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - useIt = 0; - } - } - } - if (useIt) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - - entry = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoVariableCmd() - * - * Returns information regarding class data members (variables and - * commons). Handles the following syntax: - * - * info variable ?varName? ?-protection? ?-type? ?-name? - * ?-init? ?-config? ?-value? - * - * If the ?varName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoVariableCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_HashSearch place; - Tcl_HashEntry *entry; - ItclClass *iclsPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclVariable *ivPtr; - ItclVarLookup *vlookup; - ItclHierIter hier; - char *varName; - const char *val; - int i; - int result; - - static const char *options[] = { - "-config", "-init", "-name", "-protection", "-type", - "-value", (char*)NULL - }; - enum BIvIdx { - BIvConfigIdx, BIvInitIdx, BIvNameIdx, BIvProtectIdx, - BIvTypeIdx, BIvValueIdx - } *ivlist, ivlistStorage[6]; - - static enum BIvIdx DefInfoVariable[5] = { - BIvProtectIdx, - BIvTypeIdx, - BIvNameIdx, - BIvInitIdx, - BIvValueIdx - }; - - static enum BIvIdx DefInfoPubVariable[6] = { - BIvProtectIdx, - BIvTypeIdx, - BIvNameIdx, - BIvInitIdx, - BIvConfigIdx, - BIvValueIdx - }; - - - ItclShowArgs(1, "Itcl_BiInfoVariableCmd", objc, objv); - resultPtr = NULL; - objPtr = NULL; - varName = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info variable ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?varName? ?-protection? ?-type? ?-name? ?-init? ?-config? ?-value? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - varName = Tcl_GetString(*objv); - objc--; objv++; - } - - /* - * Return info for a specific variable. - */ - if (varName) { - entry = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, varName); - if (entry == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", varName, "\" isn't a variable in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - vlookup = (ItclVarLookup*)Tcl_GetHashValue(entry); - ivPtr = vlookup->ivPtr; - - /* - * By default, return everything. - */ - if (objc == 0) { - if (ivPtr->protection == ITCL_PUBLIC && - ((ivPtr->flags & ITCL_COMMON) == 0)) { - ivlist = DefInfoPubVariable; - objc = 6; - } else { - ivlist = DefInfoVariable; - objc = 5; - } - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ivlist = &ivlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ivlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ivlist[i]) { - case BIvConfigIdx: - if (ivPtr->codePtr && - Itcl_IsMemberCodeImplemented(ivPtr->codePtr)) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->codePtr->bodyPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BIvInitIdx: - /* - * If this is the built-in "this" variable, then - * report the object name as its initialization string. - */ - if ((ivPtr->flags & ITCL_THIS_VAR) != 0) { - if ((contextIoPtr != NULL) && - (contextIoPtr->accessCmd != NULL)) { - objPtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_GetCommandFullName( - contextIoPtr->iclsPtr->interp, - contextIoPtr->accessCmd, objPtr); - } else { - objPtr = Tcl_NewStringObj("<objectName>", -1); - } - } else { - if (vlookup->ivPtr->init) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(vlookup->ivPtr->init), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - } - break; - - case BIvNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - break; - - case BIvProtectIdx: - val = Itcl_ProtectionStr(ivPtr->protection); - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BIvTypeIdx: - val = ((ivPtr->flags & ITCL_COMMON) != 0) - ? "common" : "variable"; - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BIvValueIdx: - if ((ivPtr->flags & ITCL_COMMON) != 0) { - val = Itcl_GetCommonVar(interp, - Tcl_GetString(ivPtr->fullNamePtr), - ivPtr->iclsPtr); - } else { - if (contextIoPtr == NULL) { - if (objc > 1) { - Tcl_DecrRefCount(resultPtr); - } - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, - "cannot access object-specific info ", - "without an object context", - (char*)NULL); - return TCL_ERROR; - } else { - val = Itcl_GetInstanceVar(interp, - Tcl_GetString(ivPtr->namePtr), - contextIoPtr, ivPtr->iclsPtr); - } - } - if (val == NULL) { - val = "<undefined>"; - } - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - } - } - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, Tcl_GetString(resultPtr), NULL); - Tcl_DecrRefCount(resultPtr); - } else { - - /* - * Return the list of available variables. Report the built-in - * "this" variable only once, for the most-specific class. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - entry = Tcl_FirstHashEntry(&iclsPtr->variables, &place); - while (entry) { - ivPtr = (ItclVariable*)Tcl_GetHashValue(entry); - if ((ivPtr->flags & ITCL_THIS_VAR) != 0) { - if (iclsPtr == contextIclsPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - entry = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoVarsCmd() - * - * Returns information regarding variables - * - * info vars ?pattern? - * uses ::info vars and adds Itcl common variables!! - * - * Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoVarsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - Tcl_Obj **newObjv; - Tcl_Namespace *nsPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr = NULL; - ItclVariable *ivPtr; - const char *pattern; - const char *name; - int useGlobalInfo; - int result; - ItclObject *ioPtr; - - ItclShowArgs(1, "Itcl_BiInfoVars", objc, objv); - result = TCL_OK; - useGlobalInfo = 1; - pattern = NULL; - infoPtr = (ItclObjectInfo *)clientData; - - if (objc > 2) { - Tcl_WrongNumArgs(interp, 1, objv, " ?pattern?"); - return TCL_ERROR; - } - - if (TCL_OK != Itcl_GetContext(interp, &iclsPtr, &ioPtr)) { - if (objc == 2) { - /* Give pattern a chance to determine context */ - Tcl_ResetResult(interp); - } else { - return TCL_ERROR; - } - } - if (iclsPtr) { - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET)) { - /* don't use the ::tcl::info::vars command */ - useGlobalInfo = 0; - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - } - } - if (useGlobalInfo) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc)); - newObjv[0] = Tcl_NewStringObj("::tcl::info::vars", -1); - Tcl_IncrRefCount(newObjv[0]); - memcpy(newObjv+1, objv+1, sizeof(Tcl_Obj *)*(objc-1)); - result = Tcl_EvalObjv(interp, objc, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - } else { - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(ivPtr, &iclsPtr->variables) { - if ((ivPtr->flags & ITCL_VARIABLE) != 0) { - name = Tcl_GetString(ivPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, ivPtr->namePtr); - } - } - } - /* always add the itcl_options variable */ - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj("itcl_options", -1)); - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; - } - if (objc < 2) { - return result; - } - if (result == TCL_OK) { - Tcl_DString buffer; - const char *head; - const char *tail; - /* check if the pattern contains a class namespace - * and if yes add the common private and protected vars - * and remove the ___DO_NOT_DELETE_THIS_VARIABLE var - */ - Itcl_ParseNamespPath(Tcl_GetString(objv[1]), &buffer, &head, &tail); - if (head == NULL) { - nsPtr = Tcl_GetCurrentNamespace(interp); - } else { - nsPtr = Tcl_FindNamespace(interp, head, NULL, 0); - } - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, - (char *)nsPtr); - if (hPtr != NULL) { - Itcl_List varList; - Tcl_Obj *resultListPtr; - Tcl_Obj *namePtr; - int numElems; - - Itcl_InitList(&varList); - iclsPtr = Tcl_GetHashValue(hPtr); - resultListPtr = Tcl_GetObjResult(interp); - numElems = 0; -/* FIXME !! should perhaps skip ___DO_NOT_DELETE_THIS_VARIABLE here !! */ - FOREACH_HASH_VALUE(ivPtr, &iclsPtr->variables) { - if ((ivPtr->flags & ITCL_VARIABLE) != 0) { - if (head != NULL) { - namePtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - } else { - namePtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->namePtr), -1); - } - Tcl_ListObjAppendElement(interp, resultListPtr, - namePtr); - numElems++; - } - if ((ivPtr->flags & ITCL_COMMON) != 0) { - if (ivPtr->protection != ITCL_PUBLIC) { - if (head != NULL) { - namePtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - } else { - namePtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->namePtr), -1); - } - Tcl_ListObjAppendElement(interp, resultListPtr, - namePtr); - numElems++; - } - } - } - } - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoUnknownCmd() - * - * the unknown handler for the ::itcl::builtin::Info ensemble - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoUnknownCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr, *listObj; - int usage = 1; - int code = TCL_ERROR; - - ItclShowArgs(1, "Itcl_BiInfoUnknownCmd", objc, objv); - - if (objc < 2) { - /* Namespace ensemble unknown callbacks never do this. */ - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "unknown callback should not be called directly", -1)); - return TCL_ERROR; - } - - /* Redirect to the [::info] command. */ - objPtr = Tcl_NewStringObj("::info", -1); - listObj = Tcl_NewListObj(1, &objPtr); - Tcl_IncrRefCount(listObj); - if (Tcl_GetCommandFromObj(interp, objPtr)) { - usage = 0; - Tcl_ListObjReplace(NULL, listObj, 1, 0, objc-2, objv+2); - code = Tcl_EvalObj(interp, listObj); - if (code == TCL_ERROR) { - /* Redirection to [::info] failed, but why? */ - Tcl_Obj *optDict = Tcl_GetReturnOptions(interp, code); - Tcl_Obj *key = Tcl_NewStringObj("-errorcode", -1); - Tcl_Obj *val, *elem; - - Tcl_DictObjGet(NULL, optDict, key, &val); - Tcl_DecrRefCount(key); - Tcl_ListObjIndex(NULL, val, 0, &elem); - if (elem && !strcmp(Tcl_GetString(elem), "TCL")) { - Tcl_ListObjIndex(NULL, val, 1, &elem); - if (elem && !strcmp(Tcl_GetString(elem), "LOOKUP")) { - Tcl_ListObjIndex(NULL, val, 2, &elem); - if (elem && !strcmp(Tcl_GetString(elem), "SUBCOMMAND")) { - - /* [::info didn't have that subcommand] */ - usage = 1; - Tcl_ResetResult(interp); - } - } - } - } - } - Tcl_DecrRefCount(listObj); - - if (usage) { - /* produce usage message */ - Tcl_Obj *objPtr = Tcl_NewStringObj( - "wrong # args: should be one of...\n", -1); - ItclGetInfoUsage(interp, objPtr, (ItclObjectInfo *)clientData, NULL); - Tcl_SetObjResult(interp, objPtr); - } - if (code == TCL_ERROR) { - return TCL_ERROR; - } - - /* Return a command to replicate the non-error redirect outcome */ - listObj = Tcl_NewStringObj( - "::apply {{o m args} {::tailcall ::return -options $o $m}}", -1); - Tcl_ListObjAppendElement(NULL, listObj, Tcl_GetReturnOptions(interp,code)); - Tcl_ListObjAppendElement(NULL, listObj, Tcl_GetObjResult(interp)); - Tcl_SetObjResult(interp, listObj); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoBodyCmd() - * - * Handles the usual "info body" request, returning the body for a - * specific proc. Included here for backward compatibility, since - * otherwise Tcl would complain that class procs are not real "procs". - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoBodyCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - ItclClass *contextIclsPtr = NULL; - ItclObject *contextIoPtr; - const char *what = "procedure"; - - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - int code; - Tcl_Obj *script; - - /* - * We lack the context for any specialized Itcl meaning for - * [info body], so fallback to Tcl's. - */ - - fallback: - script = Tcl_NewStringObj("::info body", -1); - if (objc == 2) { - Tcl_ListObjAppendElement(NULL, script, objv[1]); - } - Tcl_IncrRefCount(script); - code = Tcl_EvalObjEx(interp, script, 0); - Tcl_DecrRefCount(script); - if (code == TCL_ERROR && what) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "\"%s\" isn't a %s", Tcl_GetString(objv[1]), what)); - } - return code; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - what = "function"; - if (contextIclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - what = "method"; - } - if (objc != 2) { - Tcl_AppendResult(interp, - "wrong # args: should be \"info body ", what, "\"", - NULL); - return TCL_ERROR; - } - - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveCmds, (char *)objv[1]); - if (hPtr) { - ItclCmdLookup *clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - ItclMemberFunc *imPtr = clookup->imPtr; - ItclMemberCode *mcode = imPtr->codePtr; - - /* - * Return a string describing the implementation. - */ - if (mcode && Itcl_IsMemberCodeImplemented(mcode)) { - Tcl_SetObjResult(interp, mcode->bodyPtr); - } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj("<undefined>", -1)); - } - return TCL_OK; - } - - if (contextIclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, - (char *)objv[1]); - } - - if (hPtr) { - ItclDelegatedFunction *idmPtr = Tcl_GetHashValue(hPtr); - Tcl_Obj *objPtr = Tcl_NewStringObj("delegated ", -1); - - if (idmPtr->flags & ITCL_TYPE_METHOD) { - what = "typemethod"; - } - Tcl_AppendToObj(objPtr, what, -1); - Tcl_AppendToObj(objPtr, " \"", -1); - Tcl_AppendObjToObj(objPtr, objv[1]); - Tcl_AppendToObj(objPtr, "\"", -1); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - goto fallback; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoArgsCmd() - * - * Handles the usual "info args" request, returning the argument list - * for a specific proc. Included here for backward compatibility, since - * otherwise Tcl would complain that class procs are not real "procs". - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoArgsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr = NULL; - ItclClass *contextIclsPtr = NULL; - ItclObject *contextIoPtr; - const char *what = NULL; - - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK - && objc > 1) { - int code; - Tcl_Obj *script; - - /* - * We lack the context for any specialized Itcl meaning for - * [info args], so fallback to Tcl's. - */ - - fallback: - script = Tcl_NewStringObj("::info args", -1); - if (objc == 2) { - Tcl_ListObjAppendElement(NULL, script, objv[1]); - } - Tcl_IncrRefCount(script); - code = Tcl_EvalObjEx(interp, script, 0); - Tcl_DecrRefCount(script); - if (code == TCL_ERROR && what) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "\"%s\" isn't a %s", Tcl_GetString(objv[1]), what)); - } - return code; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - what = "function"; - if ((contextIclsPtr != NULL) && (contextIclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET))) { - what = "method"; - } - if (objc != 2) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "wrong # args: should be \"info args %s\"", what)); - return TCL_ERROR; - } - - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveCmds, (char *)objv[1]); - if (hPtr) { - ItclCmdLookup *clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - ItclMemberFunc *imPtr = clookup->imPtr; - ItclMemberCode *mcode = imPtr->codePtr; - - /* - * Return a string describing the argument list. - */ - if ((mcode && mcode->argListPtr != NULL) - || ((imPtr->flags & ITCL_ARG_SPEC) != 0)) { - Tcl_SetObjResult(interp, imPtr->usagePtr); - } else { - Tcl_SetObjResult(interp, Tcl_NewStringObj("<undefined>", -1)); - } - return TCL_OK; - } - - if (contextIclsPtr->flags - & (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, - (char *)objv[1]); - } - - if (hPtr) { - ItclDelegatedFunction *idmPtr = Tcl_GetHashValue(hPtr); - Tcl_Obj *objPtr = Tcl_NewStringObj("delegated ", -1); - - if (idmPtr->flags & ITCL_TYPE_METHOD) { - what = "typemethod"; - } - Tcl_AppendToObj(objPtr, what, -1); - Tcl_AppendToObj(objPtr, " \"", -1); - Tcl_AppendObjToObj(objPtr, objv[1]); - Tcl_AppendToObj(objPtr, "\"", -1); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; - } - goto fallback; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoOptionCmd() - * - * Returns information regarding class options. - * Handles the following syntax: - * - * info option ?optionName? ?-protection? ?-name? ?-resource? ?-class? - * ?-default? ?-configmethod? ?-cgetmethod? ?-validatemethod? ?-value? - * - * If the ?optionName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoOptionCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - char *optionName = NULL; - Tcl_Obj *resultPtr = NULL; - Tcl_Obj *objPtr = NULL; - Tcl_Obj *optionNamePtr; - - static const char *options[] = { - "-cgetmethod", "-cgetmethodvar","-class", - "-configuremethod", "-configuremethodvar", - "-default", - "-name", "-protection", "-resource", - "-validatemethod", "-validatemethodvar", - "-value", (char*)NULL - }; - enum BOptIdx { - BOptCgetMethodIdx, - BOptCgetMethodVarIdx, - BOptClassIdx, - BOptConfigureMethodIdx, - BOptConfigureMethodVarIdx, - BOptDefaultIdx, - BOptNameIdx, - BOptProtectIdx, - BOptResourceIdx, - BOptValidateMethodIdx, - BOptValidateMethodVarIdx, - BOptValueIdx - } *ioptlist, ioptlistStorage[12]; - - static enum BOptIdx DefInfoOption[12] = { - BOptProtectIdx, - BOptNameIdx, - BOptResourceIdx, - BOptClassIdx, - BOptDefaultIdx, - BOptCgetMethodIdx, - BOptCgetMethodVarIdx, - BOptConfigureMethodIdx, - BOptConfigureMethodVarIdx, - BOptValidateMethodIdx, - BOptValidateMethodVarIdx, - BOptValueIdx - }; - - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclOption *ioptPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - const char *val; - int i; - int result; - - ItclShowArgs(1, "Itcl_BiInfoOptionCmd", objc, objv); - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info option ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?optionName? ?-protection? ?-name? ?-resource? ?-class? - * ?-default? ?-cgetmethod? ?-cgetmethodvar? ?-configuremethod? - * ?-configuremethodvar? ?-validatemethod? ?-validatemethodvar? ?-value? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - optionName = Tcl_GetString(*objv); - objc--; - objv++; - } - - /* - * Return info for a specific option. - */ - if (optionName) { - optionNamePtr = Tcl_NewStringObj(optionName, -1); - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectOptions, - (char *)optionNamePtr); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", optionName, "\" isn't a option in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - ioptPtr = (ItclOption*)Tcl_GetHashValue(hPtr); - - /* - * By default, return everything. - */ - if (objc == 0) { - ioptlist = DefInfoOption; - objc = 9; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ioptlist = &ioptlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ioptlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ioptlist[i]) { - case BOptCgetMethodIdx: - if (ioptPtr->cgetMethodPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->cgetMethodPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptCgetMethodVarIdx: - if (ioptPtr->cgetMethodVarPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->cgetMethodVarPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptConfigureMethodIdx: - if (ioptPtr->configureMethodPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->configureMethodPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptConfigureMethodVarIdx: - if (ioptPtr->configureMethodVarPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->configureMethodVarPtr), - -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptValidateMethodIdx: - if (ioptPtr->validateMethodPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->validateMethodPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptValidateMethodVarIdx: - if (ioptPtr->validateMethodVarPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->validateMethodVarPtr), - -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptResourceIdx: - if (ioptPtr->resourceNamePtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->resourceNamePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptClassIdx: - if (ioptPtr->classNamePtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->classNamePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptDefaultIdx: - if (ioptPtr->defaultValuePtr != NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->defaultValuePtr), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - break; - - case BOptNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(ioptPtr->fullNamePtr), -1); - break; - - case BOptProtectIdx: - val = Itcl_ProtectionStr(ioptPtr->protection); - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BOptValueIdx: - if (contextIoPtr == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, - "cannot access object-specific info ", - "without an object context", - (char*)NULL); - return TCL_ERROR; - } else { - val = ItclGetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), - contextIoPtr, ioptPtr->iclsPtr); - } - if (val == NULL) { - val = "<undefined>"; - } - objPtr = Tcl_NewStringObj((const char *)val, -1); - Tcl_IncrRefCount(objPtr); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available options. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_IncrRefCount(resultPtr); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->options, &place); - while (hPtr) { - ioptPtr = (ItclOption*)Tcl_GetHashValue(hPtr); - objPtr = ioptPtr->namePtr; - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoComponentCmd() - * - * Returns information regarding class components. - * Handles the following syntax: - * - * info component ?componentName? ?-inherit? ?-name? ?-value? - * - * If the ?componentName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_BiInfoComponentCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - char *componentName = NULL; - Tcl_Obj *resultPtr = NULL; - Tcl_Obj *objPtr = NULL; - Tcl_Obj *componentNamePtr; - - static const char *components[] = { - "-name", "-inherit", "-value", (char*)NULL - }; - enum BCompIdx { - BCompNameIdx, BCompInheritIdx, BCompValueIdx - } *icomplist, icomplistStorage[3]; - - static enum BCompIdx DefInfoComponent[3] = { - BCompNameIdx, - BCompInheritIdx, - BCompValueIdx - }; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObjectInfo *infoPtr; - - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - Tcl_Namespace *nsPtr; - ItclComponent *icPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - const char *val; - int i; - int result; - - ItclShowArgs(1, "Itcl_BiInfoComponentCmd", objc, objv); - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info component ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - nsPtr = Itcl_GetUplevelNamespace(interp, 1); - if (nsPtr->parentPtr == NULL) { - /* :: namespace */ - nsPtr = contextIclsPtr->nsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "cannot find class name for namespace \"", - nsPtr->fullName, "\"", NULL); - return TCL_ERROR; - } - contextIclsPtr = Tcl_GetHashValue(hPtr); - - /* - * Process args: - * ?componentName? ?-inherit? ?-name? ?-value? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - componentName = Tcl_GetString(*objv); - objc--; - objv++; - } - - /* - * Return info for a specific component. - */ - if (componentName) { - componentNamePtr = Tcl_NewStringObj(componentName, -1); - if (contextIoPtr != NULL) { - Itcl_InitHierIter(&hier, contextIoPtr->iclsPtr); - } else { - Itcl_InitHierIter(&hier, contextIclsPtr); - } - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->components, - (char *)componentNamePtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", componentName, "\" isn't a component in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - icPtr = (ItclComponent *)Tcl_GetHashValue(hPtr); - - /* - * By default, return everything. - */ - if (objc == 0) { - icomplist = DefInfoComponent; - objc = 3; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - icomplist = &icomplistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - components, "component", 0, (int*)(&icomplist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (icomplist[i]) { - case BCompNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(icPtr->ivPtr->fullNamePtr), -1); - break; - - case BCompInheritIdx: - if (icPtr->flags & ITCL_COMPONENT_INHERIT) { - val = "1"; - } else { - val = "0"; - } - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BCompValueIdx: - if (contextIoPtr == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, - "cannot access object-specific info ", - "without an object context", - (char*)NULL); - return TCL_ERROR; - } else { - val = ItclGetInstanceVar(interp, - Tcl_GetString(icPtr->namePtr), NULL, - contextIoPtr, icPtr->ivPtr->iclsPtr); - } - if (val == NULL) { - val = "<undefined>"; - } - objPtr = Tcl_NewStringObj((const char *)val, -1); - Tcl_IncrRefCount(objPtr); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available components. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_IncrRefCount(resultPtr); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->components, &place); - while (hPtr) { - icPtr = (ItclComponent *)Tcl_GetHashValue(hPtr); - objPtr = Tcl_NewStringObj( - Tcl_GetString(icPtr->ivPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoWidgetCmd() - * - * Returns information regarding widget classes. - * Handles the following syntax: - * - * info widget ?widgetName? - * - * If the ?widgetName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoWidgetCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNs = NULL; - Tcl_Obj *objPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - char *name; - - ItclShowArgs(1, "Itcl_BiInfoWidgetCmd", objc, objv); - if (objc != 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"info widget\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - /* try it the hard way */ - ClientData clientData; - ItclObjectInfo *infoPtr; - Tcl_Object oPtr; - clientData = Itcl_GetCallFrameClientData(interp); - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject(clientData); - contextIoPtr = Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - contextIclsPtr = contextIoPtr->iclsPtr; - } - if ((contextIoPtr == NULL) || (contextIclsPtr == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info widget ... }", -1)); - return TCL_ERROR; - } - } - - /* - * If there is an object context, then return the most-specific - * class for the object. Otherwise, return the class namespace - * name. Use normal class names when possible. - */ - if (contextIoPtr) { - contextNs = contextIoPtr->iclsPtr->nsPtr; - } else { - assert(contextIclsPtr != NULL); - assert(contextIclsPtr->nsPtr != NULL); -#ifdef NEW_PROTO_RESOLVER - contextNs = contextIclsPtr->nsPtr; -#else - if (contextIclsPtr->infoPtr->useOldResolvers) { - contextNs = contextIclsPtr->nsPtr; - } else { - contextNs = contextIclsPtr->nsPtr; - } -#endif - } - - name = contextNs->fullName; - if (!(contextIclsPtr->flags & ITCL_WIDGET)) { - Tcl_AppendResult(interp, "object or class is no widget", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(name, -1); - Tcl_SetObjResult(interp, objPtr); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoExtendedClassCmd() - * - * Returns information regarding extendedclasses. - * Handles the following syntax: - * - * info extendedclass ?className? - * - * If the ?className? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoExtendedClassCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ -#ifdef NOTYET - static const char *components[] = { - "-name", "-inherit", "-value", (char*)NULL - }; - enum BCompIdx { - BCompNameIdx, BCompInheritIdx, BCompValueIdx - } *icomplist, icomplistStorage[3]; - - static enum BCompIdx DefInfoComponent[3] = { - BCompNameIdx, - BCompInheritIdx, - BCompValueIdx - }; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObjectInfo *infoPtr; - - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - Tcl_Namespace *nsPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - const char *name; - int result; - - ItclShowArgs(1, "Itcl_BiInfoExtendedClassCmd", objc, objv); - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info extendedclass ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - nsPtr = Itcl_GetUplevelNamespace(interp, 1); - if (nsPtr->parentPtr == NULL) { - /* :: namespace */ - nsPtr = contextIclsPtr->nsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "cannot find class name for namespace \"", - nsPtr->fullName, "\"", NULL); - return TCL_ERROR; - } - contextIclsPtr = Tcl_GetHashValue(hPtr); - -#endif - - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedCmd() - * - * Returns information regarding extendedclasses. - * Handles the following syntax: - * - * info extendedclass ?className? - * - * If the ?className? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ -#ifdef NOTYET - static const char *components[] = { - "-name", "-inherit", "-value", (char*)NULL - }; - enum BCompIdx { - BCompNameIdx, BCompInheritIdx, BCompValueIdx - } *icomplist, icomplistStorage[3]; - - static enum BCompIdx DefInfoComponent[3] = { - BCompNameIdx, - BCompInheritIdx, - BCompValueIdx - }; - - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObjectInfo *infoPtr; - - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - Tcl_Namespace *nsPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - const char *name; - int result; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedCmd", objc, objv); - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info delegated ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - nsPtr = Itcl_GetUplevelNamespace(interp, 1); - if (nsPtr->parentPtr == NULL) { - /* :: namespace */ - nsPtr = contextIclsPtr->nsPtr; - } - infoPtr = contextIclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "cannot find class name for namespace \"", - nsPtr->fullName, "\"", NULL); - return TCL_ERROR; - } - contextIclsPtr = Tcl_GetHashValue(hPtr); - -#endif - - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypeCmd() - * - * Returns information regarding the Type for an object. This command - * can be invoked with or without an object context: - * - * <objName> info type <= returns most-specific class name - * info type <= returns active namespace name - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypeCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNs = NULL; - Tcl_Obj *objPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - char *name; - - ItclShowArgs(1, "Itcl_BiInfoTypeCmd", objc, objv); - if (objc != 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"info type\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - /* try it the hard way */ - ClientData clientData; - ItclObjectInfo *infoPtr; - Tcl_Object oPtr; - clientData = Itcl_GetCallFrameClientData(interp); - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject(clientData); - contextIoPtr = Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - contextIclsPtr = contextIoPtr->iclsPtr; - } - if ((contextIoPtr == NULL) || (contextIclsPtr == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info type ...}", -1)); - return TCL_ERROR; - } - } - - /* - * If there is an object context, then return the most-specific - * class for the object. Otherwise, return the class namespace - * name. Use normal class names when possible. - */ - if (contextIoPtr) { - contextNs = contextIoPtr->iclsPtr->nsPtr; - } else { - assert(contextIclsPtr != NULL); - assert(contextIclsPtr->nsPtr != NULL); -#ifdef NEW_PROTO_RESOLVER - contextNs = contextIclsPtr->nsPtr; -#else - if (contextIclsPtr->infoPtr->useOldResolvers) { - contextNs = contextIclsPtr->nsPtr; - } else { - contextNs = contextIclsPtr->nsPtr; - } -#endif - } - - name = contextNs->fullName; - if (!(contextIclsPtr->flags & ITCL_TYPE)) { - Tcl_AppendResult(interp, "object or class is no type", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(name, -1); - Tcl_SetObjResult(interp, objPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoHullTypeCmd() - * - * Returns information regarding the hulltype for an object. This command - * can be invoked with or without an object context: - * - * <objName> info hulltype returns the hulltype name - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoHullTypeCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - - ItclShowArgs(1, "Itcl_BiInfoHullTypeCmd", objc, objv); - if (objc != 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"info hulltype\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - /* try it the hard way */ - ClientData clientData; - ItclObjectInfo *infoPtr; - Tcl_Object oPtr; - clientData = Itcl_GetCallFrameClientData(interp); - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject(clientData); - contextIoPtr = Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - contextIclsPtr = contextIoPtr->iclsPtr; - } - if ((contextIoPtr == NULL) || (contextIclsPtr == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info hulltype ... }", -1)); - return TCL_ERROR; - } - } - - if (!(contextIclsPtr->flags & ITCL_WIDGET)) { - Tcl_AppendResult(interp, "object or class is no widget.", - " Only ::itcl::widget has a hulltype.", NULL); - return TCL_ERROR; - } - Tcl_SetObjResult(interp, contextIclsPtr->hullTypePtr); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDefaultCmd() - * - * Returns information regarding the Type for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDefaultCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclDelegatedFunction *idmPtr; - ItclArgList *argListPtr; - const char *methodName; - const char *argName; - const char *what; - int found; - - ItclShowArgs(1, "Itcl_BiInfoDefaultCmd", objc, objv); - iclsPtr = NULL; - found = 0; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc != 4) { - Tcl_AppendResult(interp, "wrong # args, should be info default ", - "<method> <argName> <varName>", NULL); - return TCL_ERROR; - } - methodName = Tcl_GetString(objv[1]); - argName = Tcl_GetString(objv[2]); - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - if (strcmp(methodName, Tcl_GetString(imPtr->namePtr)) == 0) { - found = 1; - break; - } - } - if (found) { - argListPtr = imPtr->argListPtr; - while (argListPtr != NULL) { - if (strcmp(argName, Tcl_GetString(argListPtr->namePtr)) == 0) { - if (argListPtr->defaultValuePtr != NULL) { - if (NULL == Tcl_ObjSetVar2(interp, objv[3], NULL, - argListPtr->defaultValuePtr, TCL_LEAVE_ERR_MSG)) { - return TCL_ERROR; - } - Tcl_SetResult(interp, "1", NULL); - return TCL_OK; - } else { - Tcl_AppendResult(interp, "method \"", methodName, - "\" has no default value for argument \"", - argName, "\"", NULL); - return TCL_ERROR; - } - } - argListPtr = argListPtr->nextPtr; - } - } - if (! found) { - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(methodName, Tcl_GetString(idmPtr->namePtr)) == 0) { - what = "method"; - if (idmPtr->flags & ITCL_TYPE_METHOD) { - what = "typemethod"; - } - Tcl_AppendResult(interp, "delegated ", what, " \"", methodName, - "\"", NULL); - return TCL_ERROR; - } - } - } - if (! found) { - Tcl_AppendResult(interp, "unknown method \"", methodName, "\"", NULL); - return TCL_ERROR; - } - Tcl_AppendResult(interp, "method \"", methodName, "\" has no argument \"", - argName, "\"", NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoMethodCmd() - * - * Returns information regarding a method for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoMethodCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclMemberCode *mcode; - ItclHierIter hier; - const char *val; - char *cmdName; - int i; - int result; - - static const char *options[] = { - "-args", "-body", "-name", "-protection", "-type", - (char*)NULL - }; - enum BIfIdx { - BIfArgsIdx, BIfBodyIdx, BIfNameIdx, BIfProtectIdx, BIfTypeIdx - } *iflist, iflistStorage[5]; - - static enum BIfIdx DefInfoFunction[5] = { - BIfProtectIdx, - BIfTypeIdx, - BIfNameIdx, - BIfArgsIdx, - BIfBodyIdx - }; - - ItclShowArgs(1, "Itcl_BiInfoMethodCmd", objc, objv); - cmdName = NULL; - objPtr = NULL; - resultPtr = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info method ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - cmdName = Tcl_GetString(*objv); - objc--; objv++; - } - - /* - * Return info for a specific command. - */ - if (cmdName) { - ItclCmdLookup *clookup; - objPtr = Tcl_NewStringObj(cmdName, -1); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - objPtr = NULL; - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a method in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - mcode = imPtr->codePtr; - if (imPtr->flags & ITCL_COMMON) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a method in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * By default, return everything. - */ - if (objc == 0) { - objc = 5; - iflist = DefInfoFunction; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - iflist = &iflistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&iflist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (iflist[i]) { - case BIfArgsIdx: - if (mcode && mcode->argListPtr) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - if ((imPtr->flags & ITCL_ARG_SPEC) != 0) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - } - break; - - case BIfBodyIdx: - if (mcode && Itcl_IsMemberCodeImplemented(mcode)) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->bodyPtr), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - break; - - case BIfNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - break; - - case BIfProtectIdx: - val = Itcl_ProtectionStr(imPtr->protection); - objPtr = Tcl_NewStringObj(val, -1); - break; - - case BIfTypeIdx: - val = "method"; - objPtr = Tcl_NewStringObj(val, -1); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available commands. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->functions, &place); - while (hPtr) { - int useIt = 1; - - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(hPtr); - if (!(imPtr->flags & ITCL_METHOD)) { - useIt = 0; - } - if (useIt) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoMethodsCmd() - * - * Returns information regarding the methods for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoMethodsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclDelegatedFunction *idmPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoMethodsCmd", objc, objv); - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - name = "destroy"; - if ((pattern == NULL) || Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(name, -1)); - } - name = "info"; - if ((pattern == NULL) || Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(name, -1)); - } - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - name = Tcl_GetString(imPtr->namePtr); - if (strcmp(name, "*") == 0) { - continue; - } - if (strcmp(name, "destroy") == 0) { - continue; - } - if (strcmp(name, "info") == 0) { - continue; - } - if ((imPtr->flags & ITCL_METHOD) && - !(imPtr->flags & ITCL_CONSTRUCTOR) && - !(imPtr->flags & ITCL_DESTRUCTOR) && - !(imPtr->flags & ITCL_COMMON) && - !(imPtr->codePtr->flags & ITCL_BUILTIN)) { - if ((pattern == NULL) || - Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(imPtr->namePtr), -1)); - } - } - } - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - name = Tcl_GetString(idmPtr->namePtr); - if (strcmp(name, "*") == 0) { - continue; - } - if (strcmp(name, "destroy") == 0) { - continue; - } - if (strcmp(name, "info") == 0) { - continue; - } - if (idmPtr->flags & ITCL_METHOD) { - if ((pattern == NULL) || - Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(idmPtr->namePtr), -1)); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoOptionsCmd() - * - * Returns information regarding the Type for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoOptionsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Obj *listPtr; - Tcl_Obj *listPtr2; - Tcl_Obj *objPtr; - Tcl_Obj **lObjv; - Tcl_HashTable *tablePtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclOption *ioptPtr; - ItclDelegatedOption *idoPtr; - const char *name; - const char *val; - const char *pattern; - int lObjc; - int result; - int i; - - ItclShowArgs(1, "Itcl_BiInfoOptionsCmd", objc, objv); - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info options ", - "?pattern?", NULL); - return TCL_ERROR; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - if (ioPtr == NULL) { - tablePtr = &iclsPtr->options; - } else { - tablePtr = &ioPtr->objectOptions; - } - FOREACH_HASH_VALUE(ioptPtr, tablePtr) { - name = Tcl_GetString(ioptPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(ioptPtr->namePtr), -1)); - } - } - if (ioPtr == NULL) { - tablePtr = &iclsPtr->delegatedOptions; - } else { - tablePtr = &ioPtr->objectDelegatedOptions; - } - FOREACH_HASH_VALUE(idoPtr, tablePtr) { - name = Tcl_GetString(idoPtr->namePtr); - if (strcmp(name, "*") != 0) { - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(idoPtr->namePtr), -1)); - } - } else { - if (idoPtr->icPtr == NULL) { - Tcl_AppendResult(interp, "component \"", - Tcl_GetString(idoPtr->namePtr), - "\" is not initialized", NULL); - return TCL_ERROR; - } - val = ItclGetInstanceVar(interp, - Tcl_GetString(idoPtr->icPtr->namePtr), - NULL, ioPtr, ioPtr->iclsPtr); - if ((val != NULL) && (strlen(val) != 0)) { - objPtr = Tcl_NewStringObj(val, -1); - Tcl_AppendToObj(objPtr, " configure", -1); - result = Tcl_EvalObjEx(interp, objPtr, 0); - if (result != TCL_OK) { - return TCL_ERROR; - } - listPtr2 = Tcl_GetObjResult(interp); - Tcl_ListObjGetElements(interp, listPtr2, &lObjc, &lObjv); - for (i = 0; i < lObjc; i++) { - Tcl_ListObjIndex(interp, lObjv[i], 0, &objPtr); - hPtr2 = Tcl_FindHashEntry(&idoPtr->exceptions, - (char *)objPtr); - if (hPtr2 == NULL) { - name = Tcl_GetString(objPtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - } - } - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypesCmd() - * - * Returns information regarding the Type for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypesCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoTypesCmd", objc, objv); - infoPtr = (ItclObjectInfo *)clientData; - iclsPtr = NULL; - pattern = NULL; - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info types ", - "?pattern?", NULL); - return TCL_ERROR; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(iclsPtr, &infoPtr->nameClasses) { - if (iclsPtr->flags & ITCL_TYPE) { - name = Tcl_GetString(iclsPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(iclsPtr->namePtr), -1)); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoComponentsCmd() - * - * Returns information regarding the Components for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoComponentsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclComponent *icPtr; - ItclHierIter hier; - ItclClass *iclsPtr2; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoComponentsCmd", objc, objv); - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR in Itcl_BiInfoComponentsCmd", - " iclsPtr == NULL", NULL); - return TCL_ERROR; - } - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info components ", - "?pattern?", NULL); - return TCL_ERROR; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - FOREACH_HASH_VALUE(icPtr, &iclsPtr2->components) { - name = Tcl_GetString(icPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(icPtr->namePtr), -1)); - } - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypeMethodCmd() - * - * Returns information regarding a typemethod for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypeMethodCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclMemberCode *mcode; - ItclHierIter hier; - const char *val; - char *cmdName; - int i; - int result; - - static const char *options[] = { - "-args", "-body", "-name", "-protection", "-type", - (char*)NULL - }; - enum BIfIdx { - BIfArgsIdx, BIfBodyIdx, BIfNameIdx, BIfProtectIdx, BIfTypeIdx - } *iflist, iflistStorage[5]; - - static enum BIfIdx DefInfoFunction[5] = { - BIfProtectIdx, - BIfTypeIdx, - BIfNameIdx, - BIfArgsIdx, - BIfBodyIdx - }; - - - ItclShowArgs(1, "Itcl_BiInfoTypeMethodCmd", objc, objv); - resultPtr = NULL; - objPtr = NULL; - cmdName = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info function ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - cmdName = Tcl_GetString(*objv); - objc--; objv++; - } - - /* - * Return info for a specific command. - */ - if (cmdName) { - ItclCmdLookup *clookup; - objPtr = Tcl_NewStringObj(cmdName, -1); - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - objPtr = NULL; - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a typemethod in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - mcode = imPtr->codePtr; - if (!(imPtr->flags & ITCL_TYPE_METHOD)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a typemethod in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * By default, return everything. - */ - if (objc == 0) { - objc = 5; - iflist = DefInfoFunction; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - iflist = &iflistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&iflist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (iflist[i]) { - case BIfArgsIdx: - if (mcode && mcode->argListPtr) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - if ((imPtr->flags & ITCL_ARG_SPEC) != 0) { - if (imPtr->usagePtr == NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->usagePtr), -1); - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->usagePtr), -1); - } - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - } - break; - - case BIfBodyIdx: - if (mcode && Itcl_IsMemberCodeImplemented(mcode)) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(mcode->bodyPtr), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - break; - - case BIfNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - break; - - case BIfProtectIdx: - val = Itcl_ProtectionStr(imPtr->protection); - objPtr = Tcl_NewStringObj(val, -1); - break; - - case BIfTypeIdx: - val = "typemethod"; - objPtr = Tcl_NewStringObj(val, -1); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available commands. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->functions, &place); - while (hPtr) { - int useIt = 1; - - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(hPtr); - if (!(imPtr->flags & ITCL_TYPE_METHOD)) { - useIt = 0; - } - if (useIt) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(imPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoMethodsCmd() - * - * Returns information regarding the methods for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypeMethodsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - ItclDelegatedFunction *idmPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoTypeMethodsCmd", objc, objv); - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc > 1) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - name = "create"; - if ((pattern == NULL) || Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(name, -1)); - } - name = "destroy"; - if ((pattern == NULL) || Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(name, -1)); - } - name = "info"; - if ((pattern == NULL) || Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(name, -1)); - } - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - name = Tcl_GetString(imPtr->namePtr); - if (strcmp(name, "*") == 0) { - continue; - } - if (strcmp(name, "create") == 0) { - continue; - } - if (strcmp(name, "destroy") == 0) { - continue; - } - if (strcmp(name, "info") == 0) { - continue; - } - if (imPtr->flags & ITCL_TYPE_METHOD) { - if ((pattern == NULL) || - Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(imPtr->namePtr), -1)); - } - } - } - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - name = Tcl_GetString(idmPtr->namePtr); - if (strcmp(name, "*") == 0) { - continue; - } - if (strcmp(name, "create") == 0) { - continue; - } - if (strcmp(name, "destroy") == 0) { - continue; - } - if (strcmp(name, "info") == 0) { - continue; - } - if (idmPtr->flags & ITCL_TYPE_METHOD) { - if ((pattern == NULL) || - Tcl_StringMatch((const char *)name, pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(Tcl_GetString(idmPtr->namePtr), -1)); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypeVarsCmd() - * - * Returns information regarding variables for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypeVarsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoTypeVarsCmd", objc, objv); - if (objc > 2) { - Tcl_AppendResult(interp, - "wrong # args should be: info typevars ?pattern?", NULL); - return TCL_ERROR; - } - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(ivPtr, &iclsPtr->variables) { - if ((pattern == NULL) || - Tcl_StringMatch(Tcl_GetString(ivPtr->namePtr), pattern)) { - if (ivPtr->flags & ITCL_TYPE_VARIABLE) { - Tcl_ListObjAppendElement(interp, listPtr, ivPtr->fullNamePtr); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypeVariableCmd() - * - * Returns information regarding a typevariable for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoTypeVariableCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - ItclClass *iclsPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclVariable *ivPtr; - ItclVarLookup *vlookup; - ItclHierIter hier; - char *varName; - const char *val; - int i; - int result; - - static const char *options[] = { - "-init", "-name", "-protection", "-type", - "-value", (char*)NULL - }; - enum BIvIdx { - BIvInitIdx, - BIvNameIdx, - BIvProtectIdx, - BIvTypeIdx, - BIvValueIdx - } *ivlist, ivlistStorage[5]; - - static enum BIvIdx DefInfoVariable[5] = { - BIvProtectIdx, - BIvTypeIdx, - BIvNameIdx, - BIvInitIdx, - BIvValueIdx - }; - - ItclShowArgs(1, "Itcl_BiInfoTypeVariableCmd", objc, objv); - resultPtr = NULL; - objPtr = NULL; - varName = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info typevariable ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?varName? ?-protection? ?-type? ?-name? ?-init? ?-config? ?-value? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - varName = Tcl_GetString(*objv); - objc--; objv++; - } - - /* - * Return info for a specific variable. - */ - if (varName) { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->resolveVars, varName); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", varName, "\" isn't a typevariable in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - ivPtr = vlookup->ivPtr; - if (!(ivPtr->flags & ITCL_TYPE_VARIABLE)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", varName, "\" isn't a typevariable in class \"", - contextIclsPtr->nsPtr->fullName, "\"", - (char*)NULL); - return TCL_ERROR; - } - /* - * By default, return everything. - */ - if (objc == 0) { - ivlist = DefInfoVariable; - objc = 5; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ivlist = &ivlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ivlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ivlist[i]) { - case BIvInitIdx: - /* - * If this is the built-in "this" variable, then - * report the object name as its initialization string. - */ - if ((ivPtr->flags & ITCL_THIS_VAR) != 0) { - if ((contextIoPtr != NULL) && - (contextIoPtr->accessCmd != NULL)) { - objPtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_GetCommandFullName( - contextIoPtr->iclsPtr->interp, - contextIoPtr->accessCmd, objPtr); - } else { - objPtr = Tcl_NewStringObj("<objectName>", -1); - } - } else { - if (vlookup->ivPtr->init) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(vlookup->ivPtr->init), -1); - } else { - objPtr = Tcl_NewStringObj("<undefined>", -1); - } - } - break; - - case BIvNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - break; - - case BIvProtectIdx: - val = Itcl_ProtectionStr(ivPtr->protection); - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BIvTypeIdx: - val = ((ivPtr->flags & ITCL_COMMON) != 0) - ? "common" : "variable"; - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - - case BIvValueIdx: - if ((ivPtr->flags & ITCL_COMMON) != 0) { - val = Itcl_GetCommonVar(interp, - Tcl_GetString(ivPtr->fullNamePtr), - ivPtr->iclsPtr); - } else { - if (contextIoPtr == NULL) { - if (objc > 1) { - Tcl_DecrRefCount(resultPtr); - } - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, - "cannot access object-specific info ", - "without an object context", - (char*)NULL); - return TCL_ERROR; - } else { - val = Itcl_GetInstanceVar(interp, - Tcl_GetString(ivPtr->namePtr), - contextIoPtr, ivPtr->iclsPtr); - } - } - if (val == NULL) { - val = "<undefined>"; - } - objPtr = Tcl_NewStringObj((const char *)val, -1); - break; - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - } - } - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, Tcl_GetString(resultPtr), NULL); - Tcl_DecrRefCount(resultPtr); - } else { - - /* - * Return the list of available variables. Report the built-in - * "this" variable only once, for the most-specific class. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->variables, &place); - while (hPtr) { - ivPtr = (ItclVariable*)Tcl_GetHashValue(hPtr); - if (ivPtr->flags & ITCL_TYPE_VAR) { - if ((ivPtr->flags & ITCL_THIS_VAR) != 0) { - if (iclsPtr == contextIclsPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - } else { - objPtr = Tcl_NewStringObj( - Tcl_GetString(ivPtr->fullNamePtr), -1); - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, - resultPtr, objPtr); - } - } - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoVariablesCmd() - * - * Returns information regarding typevariables for an object. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoVariablesCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(1, "Itcl_BiInfoVariablesCmd", objc, objv); - Tcl_AppendResult(interp, "Itcl_BiInfoVariablesCmd not yet implemented\n", - NULL); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoWidgetadaptorCmd() - * - * Returns information regarding a widgetadaptor. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoWidgetadaptorCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Namespace *contextNs = NULL; - Tcl_Obj *objPtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - char *name; - - ItclShowArgs(1, "Itcl_BiInfoWidgetadaptorCmd", objc, objv); - if (objc != 1) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"info widgetadaptor\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - contextIclsPtr = NULL; - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - /* try it the hard way */ - ClientData clientData; - ItclObjectInfo *infoPtr; - Tcl_Object oPtr; - clientData = Itcl_GetCallFrameClientData(interp); - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - if (clientData != NULL) { - oPtr = Tcl_ObjectContextObject(clientData); - contextIoPtr = Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - contextIclsPtr = contextIoPtr->iclsPtr; - } - if ((contextIoPtr == NULL) || (contextIclsPtr == NULL)) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info widgetadaptor ... }", -1)); - return TCL_ERROR; - } - } - - /* - * If there is an object context, then return the most-specific - * class for the object. Otherwise, return the class namespace - * name. Use normal class names when possible. - */ - if (contextIoPtr) { - contextNs = contextIoPtr->iclsPtr->nsPtr; - } else { - assert(contextIclsPtr != NULL); - assert(contextIclsPtr->nsPtr != NULL); -#ifdef NEW_PROTO_RESOLVER - contextNs = contextIclsPtr->nsPtr; -#else - if (contextIclsPtr->infoPtr->useOldResolvers) { - contextNs = contextIclsPtr->nsPtr; - } else { - contextNs = contextIclsPtr->nsPtr; - } -#endif - } - - name = contextNs->fullName; - if (!(contextIclsPtr->flags & ITCL_WIDGETADAPTOR)) { - Tcl_AppendResult(interp, "object or class is no widgetadaptor", NULL); - return TCL_ERROR; - } - objPtr = Tcl_NewStringObj(name, -1); - Tcl_SetObjResult(interp, objPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoInstancesCmd() - * - * Returns information regarding instances. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoInstancesCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoInstancesCmd", objc, objv); - if (objc > 2) { - Tcl_AppendResult(interp, - "wrong # args should be: info instances ?pattern?", NULL); - return TCL_ERROR; - } - iclsPtr = NULL; - pattern = NULL; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - Tcl_AppendResult(interp, "cannot get context ", (char*)NULL); - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - infoPtr = (ItclObjectInfo *)clientData; - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(ioPtr, &infoPtr->objects) { - /* FIXME need to scan the inheritance too */ - if (ioPtr->iclsPtr == iclsPtr) { - if (ioPtr->iclsPtr->flags & ITCL_WIDGETADAPTOR) { - objPtr = Tcl_NewStringObj(Tcl_GetCommandName(interp, - ioPtr->accessCmd), -1); - } else { - objPtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - } - if ((pattern == NULL) || - Tcl_StringMatch(Tcl_GetString(objPtr), pattern)) { - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } else { - Tcl_DecrRefCount(objPtr); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedOptionsCmd() - * - * Returns information regarding delegated options. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedOptionsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - Tcl_Obj *objPtr2; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclDelegatedOption *idoPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedOptionsCmd", objc, objv); - pattern = NULL; - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info delegated ", - "options ?pattern?", NULL); - return TCL_ERROR; - } - - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(idoPtr, &iclsPtr->delegatedOptions) { - if (iclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - name = Tcl_GetString(idoPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - objPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, objPtr, - idoPtr->namePtr); - if (idoPtr->icPtr != NULL) { - Tcl_ListObjAppendElement(interp, objPtr, - idoPtr->icPtr->namePtr); - } else { - objPtr2 = Tcl_NewStringObj("", -1); - Tcl_IncrRefCount(objPtr2); - Tcl_ListObjAppendElement(interp, objPtr, objPtr2); - } - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedMethodsCmd() - * - * Returns information regarding delegated methods. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedMethodsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - Tcl_Obj *objPtr2; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedMethodsCmd", objc, objv); - pattern = NULL; - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info delegated ", - "methods ?pattern?", NULL); - return TCL_ERROR; - } - - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (iclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - name = Tcl_GetString(idmPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - if ((idmPtr->flags & ITCL_TYPE_METHOD) == 0) { - objPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, objPtr, - idmPtr->namePtr); - if (idmPtr->icPtr != NULL) { - Tcl_ListObjAppendElement(interp, objPtr, - idmPtr->icPtr->namePtr); - } else { - objPtr2 = Tcl_NewStringObj("", -1); - Tcl_IncrRefCount(objPtr2); - Tcl_ListObjAppendElement(interp, objPtr, objPtr2); - } - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoTypeMethodsCmd() - * - * Returns information regarding delegated type methods. This command - * can be invoked with or without an object context: - * - * - * Returns a status TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedTypeMethodsCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *listPtr; - Tcl_Obj *objPtr; - Tcl_Obj *objPtr2; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - const char *name; - const char *pattern; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedTypeMethodsCmd", objc, objv); - pattern = NULL; - if (objc > 2) { - Tcl_AppendResult(interp, "wrong # args should be: info delegated ", - "typemethods ?pattern?", NULL); - return TCL_ERROR; - } - - if (objc == 2) { - pattern = Tcl_GetString(objv[1]); - } - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr != NULL) { - iclsPtr = ioPtr->iclsPtr; - } - listPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (iclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR|ITCL_WIDGET|ITCL_ECLASS)) { - name = Tcl_GetString(idmPtr->namePtr); - if ((pattern == NULL) || - Tcl_StringMatch(name, pattern)) { - if (idmPtr->flags & ITCL_TYPE_METHOD) { - objPtr = Tcl_NewListObj(0, NULL); - Tcl_ListObjAppendElement(interp, objPtr, - idmPtr->namePtr); - if (idmPtr->icPtr != NULL) { - Tcl_ListObjAppendElement(interp, objPtr, - idmPtr->icPtr->namePtr); - } else { - objPtr2 = Tcl_NewStringObj("", -1); - Tcl_IncrRefCount(objPtr2); - Tcl_ListObjAppendElement(interp, objPtr, objPtr2); - } - Tcl_ListObjAppendElement(interp, listPtr, objPtr); - } - } - } - } - Tcl_SetObjResult(interp, listPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedUnknownCmd() - * - * the unknown handler for the ::itcl::builtin::Info::delagted ensemble - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedUnknownCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *objPtr; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedUnknownCmd", objc, objv); - /* produce usage message */ - objPtr = Tcl_NewStringObj( - "wrong # args: should be one of...\n", -1); - ItclGetInfoDelegatedUsage(interp, objPtr, (ItclObjectInfo *)clientData); - Tcl_SetObjResult(interp, objPtr); - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedOptionCmd() - * - * Returns information regarding class options. - * Handles the following syntax: - * - * info delegated option ?optionName? ?-name? ?-resource? ?-class? - * ?-component? ?-as? ?-exceptions? - * - * If the ?optionName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedOptionCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashSearch place; - Tcl_Namespace *nsPtr; - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_Obj *optionNamePtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclObjectInfo *infoPtr; - ItclDelegatedOption *idoptPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - char *optionName; - int i; - int result; - - static const char *options[] = { - "-as", "-class", "-component", "-exceptions", - "-name", "-resource", (char*)NULL - }; - enum BOptIdx { - BOptAsIdx, BOptClassIdx, BOptComponentIdx, BOptExceptionsIdx, - BOptNameIdx, BOptResourceIdx - } *ioptlist, ioptlistStorage[6]; - - static enum BOptIdx DefInfoOption[6] = { - BOptNameIdx, - BOptResourceIdx, - BOptClassIdx, - BOptComponentIdx, - BOptAsIdx, - BOptExceptionsIdx - }; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedOptionCmd", objc, objv); - optionName = NULL; - objPtr = NULL; - resultPtr = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info delegated option ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - nsPtr = Itcl_GetUplevelNamespace(interp, 1); - infoPtr = contextIclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "cannot find class name for namespace \"", - nsPtr->fullName, "\"", NULL); - return TCL_ERROR; - } - contextIclsPtr = Tcl_GetHashValue(hPtr); - - /* - * Process args: - * ?optionName? ?-name? ?-resource? ?-class? - * ?-as? ?-exceptions? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - optionName = Tcl_GetString(*objv); - objc--; - objv++; - } - - /* - * Return info for a specific option. - */ - if (optionName) { - optionNamePtr = Tcl_NewStringObj(optionName, -1); - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedOptions, - (char *)optionNamePtr); - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", optionName, "\" isn't an option in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - idoptPtr = (ItclDelegatedOption*)Tcl_GetHashValue(hPtr); - - /* - * By default, return everything. - */ - if (objc == 0) { - ioptlist = DefInfoOption; - objc = 6; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ioptlist = &ioptlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ioptlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ioptlist[i]) { - case BOptAsIdx: - if (idoptPtr->asPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idoptPtr->asPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptExceptionsIdx: - { - Tcl_Obj *entryObj; - int hadEntries; - hadEntries = 0; - objPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(entryObj, &idoptPtr->exceptions) { - Tcl_ListObjAppendElement(interp, objPtr, entryObj); - } - if (!hadEntries) { - objPtr = Tcl_NewStringObj("", -1); - } - } - break; - case BOptResourceIdx: - if (idoptPtr->resourceNamePtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idoptPtr->resourceNamePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptClassIdx: - if (idoptPtr->classNamePtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idoptPtr->classNamePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptComponentIdx: - if (idoptPtr->icPtr != NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idoptPtr->icPtr->namePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(idoptPtr->namePtr), -1); - break; - - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available options. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_IncrRefCount(resultPtr); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->delegatedOptions, &place); - while (hPtr) { - idoptPtr = (ItclDelegatedOption*)Tcl_GetHashValue(hPtr); - objPtr = idoptPtr->namePtr; - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr); - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedMethodCmd() - * - * Returns information regarding class options. - * Handles the following syntax: - * - * info delegated method ?methodName? ?-name? - * ?-component? ?-as? ?-using? ?-exceptions? - * - * If the ?optionName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedMethodCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_HashSearch place; - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_Obj *cmdNamePtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclDelegatedFunction *idmPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - char *cmdName; - int i; - int result; - - static const char *options[] = { - "-as", "-component", "-exceptions", - "-name", "-using", (char*)NULL - }; - enum BOptIdx { - BOptAsIdx, - BOptComponentIdx, - BOptExceptionsIdx, - BOptNameIdx, - BOptUsingIdx - } *ioptlist, ioptlistStorage[5]; - - static enum BOptIdx DefInfoOption[5] = { - BOptNameIdx, - BOptComponentIdx, - BOptAsIdx, - BOptUsingIdx, - BOptExceptionsIdx - }; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedMethodCmd", objc, objv); - cmdName = NULL; - objPtr = NULL; - resultPtr = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info delegated method ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?methodName? ?-name? ?-using? - * ?-as? ?-component? ?-exceptions? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - cmdName = Tcl_GetString(*objv); - objc--; - objv++; - } - - /* - * Return info for a specific option. - */ - if (cmdName) { - cmdNamePtr = Tcl_NewStringObj(cmdName, -1); - if (contextIoPtr != NULL) { - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedFunctions, - (char *)cmdNamePtr); - } else { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, - (char *)cmdNamePtr); - } - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a delegated method in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - idmPtr = (ItclDelegatedFunction*)Tcl_GetHashValue(hPtr); - if (!(idmPtr->flags & ITCL_METHOD)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a delegated method in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - /* - * By default, return everything. - */ - if (objc == 0) { - ioptlist = DefInfoOption; - objc = 5; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ioptlist = &ioptlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ioptlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ioptlist[i]) { - case BOptAsIdx: - if (idmPtr->asPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->asPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptExceptionsIdx: - { - Tcl_Obj *entryObj; - int hadEntries; - hadEntries = 0; - objPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(entryObj, &idmPtr->exceptions) { - Tcl_ListObjAppendElement(interp, objPtr, entryObj); - } - if (!hadEntries) { - objPtr = Tcl_NewStringObj("", -1); - } - } - break; - case BOptUsingIdx: - if (idmPtr->usingPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->usingPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptComponentIdx: - if (idmPtr->icPtr != NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->icPtr->namePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->namePtr), -1); - break; - - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available options. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_IncrRefCount(resultPtr); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->delegatedFunctions, &place); - while (hPtr) { - idmPtr = (ItclDelegatedFunction *)Tcl_GetHashValue(hPtr); - if (idmPtr->flags & ITCL_METHOD) { - objPtr = idmPtr->namePtr; - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BiInfoDelegatedTypeMethodCmd() - * - * Returns information regarding class options. - * Handles the following syntax: - * - * info delegated typemethod ?methodName? ?-name? - * ?-component? ?-as? ?-exceptions? - * - * If the ?optionName? is not specified, then a list of all known - * data members is returned. Otherwise, the information for a - * specific member is returned. Returns a status TCL_OK/TCL_ERROR - * to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_BiInfoDelegatedTypeMethodCmd( - ClientData clientData, /* ItclObjectInfo Ptr */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - - FOREACH_HASH_DECLS; - Tcl_HashSearch place; - Tcl_Obj *resultPtr; - Tcl_Obj *objPtr; - Tcl_Obj *cmdNamePtr; - ItclClass *contextIclsPtr; - ItclObject *contextIoPtr; - ItclDelegatedFunction *idmPtr; - ItclHierIter hier; - ItclClass *iclsPtr; - char *cmdName; - int i; - int result; - - static const char *options[] = { - "-as", "-component", "-exceptions", - "-name", "-using", (char*)NULL - }; - enum BOptIdx { - BOptAsIdx, - BOptComponentIdx, - BOptExceptionsIdx, - BOptNameIdx, - BOptUsingIdx - } *ioptlist, ioptlistStorage[5]; - - static enum BOptIdx DefInfoOption[5] = { - BOptNameIdx, - BOptComponentIdx, - BOptAsIdx, - BOptUsingIdx, - BOptExceptionsIdx - }; - - ItclShowArgs(1, "Itcl_BiInfoDelegatedTypeMethodCmd", objc, objv); - cmdName = NULL; - objPtr = NULL; - resultPtr = NULL; - contextIclsPtr = NULL; - /* - * If this command is not invoked within a class namespace, - * signal an error. - */ - if (Itcl_GetContext(interp, &contextIclsPtr, &contextIoPtr) != TCL_OK) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - "\nget info like this instead: " - "\n namespace eval className { info delegated type method ... }", -1)); - return TCL_ERROR; - } - if (contextIoPtr != NULL) { - contextIclsPtr = contextIoPtr->iclsPtr; - } - - /* - * Process args: - * ?methodName? ?-name? ?-using? - * ?-as? ?-component? ?-exceptions? - */ - objv++; /* skip over command name */ - objc--; - - if (objc > 0) { - cmdName = Tcl_GetString(*objv); - objc--; - objv++; - } - - /* - * Return info for a specific option. - */ - if (cmdName) { - cmdNamePtr = Tcl_NewStringObj(cmdName, -1); - if (contextIoPtr != NULL) { - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectDelegatedFunctions, - (char *)cmdNamePtr); - } else { - hPtr = Tcl_FindHashEntry(&contextIclsPtr->delegatedFunctions, - (char *)cmdNamePtr); - } - if (hPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a delegated typemethod in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - idmPtr = (ItclDelegatedFunction*)Tcl_GetHashValue(hPtr); - if (!(idmPtr->flags & ITCL_TYPE_METHOD)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", cmdName, "\" isn't a delegated typemethod in object \"", - Tcl_GetString(contextIoPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - /* - * By default, return everything. - */ - if (objc == 0) { - ioptlist = DefInfoOption; - objc = 5; - } else { - - /* - * Otherwise, scan through all remaining flags and - * figure out what to return. - */ - ioptlist = &ioptlistStorage[0]; - for (i=0 ; i < objc; i++) { - result = Tcl_GetIndexFromObj(interp, objv[i], - options, "option", 0, (int*)(&ioptlist[i])); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - } - - if (objc > 1) { - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - } - - for (i=0 ; i < objc; i++) { - switch (ioptlist[i]) { - case BOptAsIdx: - if (idmPtr->asPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->asPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptExceptionsIdx: - { - Tcl_Obj *entryObj; - int hadEntries; - hadEntries = 0; - objPtr = Tcl_NewListObj(0, NULL); - FOREACH_HASH_VALUE(entryObj, &idmPtr->exceptions) { - Tcl_ListObjAppendElement(interp, objPtr, entryObj); - } - if (!hadEntries) { - objPtr = Tcl_NewStringObj("", -1); - } - } - break; - case BOptUsingIdx: - if (idmPtr->usingPtr) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->usingPtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptComponentIdx: - if (idmPtr->icPtr != NULL) { - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->icPtr->namePtr), -1); - } else { - objPtr = Tcl_NewStringObj("", -1); - } - break; - - case BOptNameIdx: - objPtr = Tcl_NewStringObj( - Tcl_GetString(idmPtr->namePtr), -1); - break; - - } - - if (objc == 1) { - resultPtr = objPtr; - } else { - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - } - Tcl_SetObjResult(interp, resultPtr); - } else { - - /* - * Return the list of available options. - */ - resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL); - Tcl_IncrRefCount(resultPtr); - Itcl_InitHierIter(&hier, contextIclsPtr); - while ((iclsPtr=Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr->delegatedFunctions, &place); - while (hPtr) { - idmPtr = (ItclDelegatedFunction *)Tcl_GetHashValue(hPtr); - if (idmPtr->flags & ITCL_TYPE_METHOD) { - objPtr = idmPtr->namePtr; - Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, - objPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - } - Itcl_DeleteHierIter(&hier); - - Tcl_SetObjResult(interp, resultPtr); - } - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclInt.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclInt.h deleted file mode 100644 index 5134023..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclInt.h +++ /dev/null @@ -1,854 +0,0 @@ -/* - * itclInt.h -- - * - * This file contains internal definitions for the C-implemented part of a - * Itcl - * - * Copyright (c) 2007 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif - -/* - * Used to tag functions that are only to be visible within the module being - * built and not outside it (where this is supported by the linker). - */ - -#ifndef MODULE_SCOPE -# ifdef __cplusplus -# define MODULE_SCOPE extern "C" -# else -# define MODULE_SCOPE extern -# endif -#endif - -#include <string.h> -#include <ctype.h> -#include <tclOO.h> -#include "itcl.h" -#include "itclMigrate2TclCore.h" -#include "itclTclIntStubsFcn.h" - -/* - * Utility macros: STRINGIFY takes an argument and wraps it in "" (double - * quotation marks). - */ - -#ifndef STRINGIFY -# define STRINGIFY(x) STRINGIFY1(x) -# define STRINGIFY1(x) #x -#endif - -/* - * Since the Tcl/Tk distribution doesn't perform any asserts, - * dynamic loading can fail to find the __assert function. - * As a workaround, we'll include our own. - */ - -#undef assert -#define DEBUG 1 -#ifndef DEBUG -#define assert(EX) ((void)0) -#else -#define assert(EX) (void)((EX) || (Itcl_Assert(STRINGIFY(EX), __FILE__, __LINE__), 0)) -#endif /* DEBUG */ - -#define ITCL_INTERP_DATA "itcl_data" -#define ITCL_TK_VERSION "8.6" - -/* - * Convenience macros for iterating through hash tables. FOREACH_HASH_DECLS - * sets up the declarations needed for the main macro, FOREACH_HASH, which - * does the actual iteration. FOREACH_HASH_VALUE is a restricted version that - * only iterates over values. - */ - -#define FOREACH_HASH_DECLS \ - Tcl_HashEntry *hPtr;Tcl_HashSearch search -#define FOREACH_HASH(key,val,tablePtr) \ - for(hPtr=Tcl_FirstHashEntry((tablePtr),&search); hPtr!=NULL ? \ - ((key)=(void *)Tcl_GetHashKey((tablePtr),hPtr),\ - (val)=Tcl_GetHashValue(hPtr),1):0; hPtr=Tcl_NextHashEntry(&search)) -#define FOREACH_HASH_VALUE(val,tablePtr) \ - for(hPtr=Tcl_FirstHashEntry((tablePtr),&search); hPtr!=NULL ? \ - ((val)=Tcl_GetHashValue(hPtr),1):0;hPtr=Tcl_NextHashEntry(&search)) - -/* - * What sort of size of things we like to allocate. - */ - -#define ALLOC_CHUNK 8 - -#define ITCL_VARIABLES_NAMESPACE "::itcl::internal::variables" -#define ITCL_COMMANDS_NAMESPACE "::itcl::internal::commands" - -#ifdef ITCL_PRESERVE_DEBUG -#define ITCL_PRESERVE_BUCKET_SIZE 50 -#define ITCL_PRESERVE_INCR 1 -#define ITCL_PRESERVE_DECR -1 -#define ITCL_PRESERVE_DELETED 0 - -typedef struct ItclPreserveInfoEntry { - int type; - int line; - const char * fileName; -} ItclPreserveInfoEntry; - -typedef struct ItclPreserveInfo { - size_t refCount; - ClientData clientData; - size_t size; - size_t numEntries; - ItclPreserveInfoEntry *entries; -} ItclPreserveInfo; - -#endif - - -typedef struct ItclFoundation { - Itcl_Stack methodCallStack; - Tcl_Command dispatchCommand; -} ItclFoundation; - -typedef struct ItclArgList { - struct ItclArgList *nextPtr; /* pointer to next argument */ - Tcl_Obj *namePtr; /* name of the argument */ - Tcl_Obj *defaultValuePtr; /* default value or NULL if none */ -} ItclArgList; - -/* - * Common info for managing all known objects. - * Each interpreter has one of these data structures stored as - * clientData in the "itcl" namespace. It is also accessible - * as associated data via the key ITCL_INTERP_DATA. - */ -struct ItclClass; -struct ItclObject; -struct ItclMemberFunc; -struct EnsembleInfo; -struct ItclDelegatedOption; -struct ItclDelegatedFunction; - -typedef struct ItclObjectInfo { - Tcl_Interp *interp; /* interpreter that manages this info */ - Tcl_HashTable objects; /* list of all known objects key is - * ioPtr */ - Tcl_HashTable objectCmds; /* list of known objects using accessCmd */ - Tcl_HashTable unused5; /* list of known objects using namePtr */ - Tcl_HashTable classes; /* list of all known classes, - * key is iclsPtr */ - Tcl_HashTable nameClasses; /* maps from fullNamePtr to iclsPtr */ - Tcl_HashTable namespaceClasses; /* maps from nsPtr to iclsPtr */ - Tcl_HashTable procMethods; /* maps from procPtr to mFunc */ - Tcl_HashTable instances; /* maps from instanceNumber to ioPtr */ - Tcl_HashTable unused8; /* maps from ioPtr to instanceNumber */ - Tcl_HashTable frameContext; /* maps frame to context stack */ - Tcl_HashTable classTypes; /* maps from class type i.e. "widget" - * to define value i.e. ITCL_WIDGET */ - int protection; /* protection level currently in effect */ - int useOldResolvers; /* whether to use the "old" style - * resolvers or the CallFrame resolvers */ - Itcl_Stack clsStack; /* stack of class definitions currently - * being parsed */ - Itcl_Stack unused; /* Removed */ - Itcl_Stack unused6; /* obsolete field */ - struct ItclObject *currIoPtr; /* object currently being constructed - * set only during calling of constructors - * otherwise NULL */ - Tcl_ObjectMetadataType *class_meta_type; - /* type for getting the Itcl class info - * from a TclOO Tcl_Object */ - const Tcl_ObjectMetadataType *object_meta_type; - /* type for getting the Itcl object info - * from a TclOO Tcl_Object */ - Tcl_Object unused1; /* the root object of Itcl */ - Tcl_Class clazzClassPtr; /* the root class of Itcl */ - struct EnsembleInfo *ensembleInfo; - struct ItclClass *currContextIclsPtr; - /* context class for delegated option - * handling */ - int currClassFlags; /* flags for the class just in creation */ - int buildingWidget; /* set if in construction of a widget */ - int unparsedObjc; /* number options not parsed by - ItclExtendedConfigure/-Cget function */ - Tcl_Obj **unparsedObjv; /* options not parsed by - ItclExtendedConfigure/-Cget function */ - int functionFlags; /* used for creating of ItclMemberCode */ - int unused7; /* used for having a unique key for objects - * for use in mytypemethod etc. */ - struct ItclDelegatedOption *currIdoPtr; - /* the current delegated option info */ - int inOptionHandling; /* used to indicate for type/widget ... - * that there is an option processing - * and methods are allowed to be called */ - /* these are the Tcl_Obj Ptrs for the clazz unknown procedure */ - /* need to store them to be able to free them at the end */ - int itclWidgetInitted; /* set to 1 if itclWidget.tcl has already - * been called - */ - int itclHullCmdsInitted; /* set to 1 if itclHullCmds.tcl has already - * been called - */ - Tcl_Obj *unused2; - Tcl_Obj *unused3; - Tcl_Obj *unused4; - Tcl_Obj *infoVarsPtr; - Tcl_Obj *infoVars3Ptr; - Tcl_Obj *infoVars4Ptr; - Tcl_Obj *typeDestructorArgumentPtr; - struct ItclObject *lastIoPtr; /* last object constructed */ - Tcl_Command infoCmd; -} ItclObjectInfo; - -typedef struct EnsembleInfo { - Tcl_HashTable ensembles; /* list of all known ensembles */ - Tcl_HashTable subEnsembles; /* list of all known subensembles */ - int numEnsembles; - Tcl_Namespace *ensembleNsPtr; -} EnsembleInfo; -/* - * Representation for each [incr Tcl] class. - */ -#define ITCL_CLASS 0x1 -#define ITCL_TYPE 0x2 -#define ITCL_WIDGET 0x4 -#define ITCL_WIDGETADAPTOR 0x8 -#define ITCL_ECLASS 0x10 -#define ITCL_NWIDGET 0x20 -#define ITCL_WIDGET_FRAME 0x40 -#define ITCL_WIDGET_LABEL_FRAME 0x80 -#define ITCL_WIDGET_TOPLEVEL 0x100 -#define ITCL_WIDGET_TTK_FRAME 0x200 -#define ITCL_WIDGET_TTK_LABEL_FRAME 0x400 -#define ITCL_WIDGET_TTK_TOPLEVEL 0x800 -#define ITCL_CLASS_IS_DELETED 0x1000 -#define ITCL_CLASS_IS_DESTROYED 0x2000 -#define ITCL_CLASS_NS_IS_DESTROYED 0x4000 -#define ITCL_CLASS_IS_RENAMED 0x8000 -#define ITCL_CLASS_IS_FREED 0x10000 -#define ITCL_CLASS_DERIVED_RELEASED 0x20000 -#define ITCL_CLASS_NS_TEARDOWN 0x40000 -#define ITCL_CLASS_NO_VARNS_DELETE 0x80000 -#define ITCL_CLASS_SHOULD_VARNS_DELETE 0x100000 -#define ITCL_CLASS_DESTRUCTOR_CALLED 0x400000 - - -typedef struct ItclClass { - Tcl_Obj *namePtr; /* class name */ - Tcl_Obj *fullNamePtr; /* fully qualified class name */ - Tcl_Interp *interp; /* interpreter that manages this info */ - Tcl_Namespace *nsPtr; /* namespace representing class scope */ - Tcl_Command accessCmd; /* access command for creating instances */ - Tcl_Command thisCmd; /* needed for deletion of class */ - - struct ItclObjectInfo *infoPtr; - /* info about all known objects - * and other stuff like stacks */ - Itcl_List bases; /* list of base classes */ - Itcl_List derived; /* list of all derived classes */ - Tcl_HashTable heritage; /* table of all base classes. Look up - * by pointer to class definition. This - * provides fast lookup for inheritance - * tests. */ - Tcl_Obj *initCode; /* initialization code for new objs */ - Tcl_HashTable variables; /* definitions for all data members - in this class. Look up simple string - names and get back ItclVariable* ptrs */ - Tcl_HashTable options; /* definitions for all option members - in this class. Look up simple string - names and get back ItclOption* ptrs */ - Tcl_HashTable components; /* definitions for all component members - in this class. Look up simple string - names and get back ItclComponent* ptrs */ - Tcl_HashTable functions; /* definitions for all member functions - in this class. Look up simple string - names and get back ItclMemberFunc* ptrs */ - Tcl_HashTable delegatedOptions; /* definitions for all delegated options - in this class. Look up simple string - names and get back - ItclDelegatedOption * ptrs */ - Tcl_HashTable delegatedFunctions; /* definitions for all delegated methods - or procs in this class. Look up simple - string names and get back - ItclDelegatedFunction * ptrs */ - Tcl_HashTable methodVariables; /* definitions for all methodvariable members - in this class. Look up simple string - names and get back - ItclMethodVariable* ptrs */ - int numInstanceVars; /* number of instance vars in variables - table */ - Tcl_HashTable classCommons; /* used for storing variable namespace - * string for Tcl_Resolve */ - Tcl_HashTable resolveVars; /* all possible names for variables in - * this class (e.g., x, foo::x, etc.) */ - Tcl_HashTable resolveCmds; /* all possible names for functions in - * this class (e.g., x, foo::x, etc.) */ - Tcl_HashTable contextCache; /* cache for function contexts */ - struct ItclMemberFunc *unused2; - /* the class constructor or NULL */ - struct ItclMemberFunc *unused3; - /* the class destructor or NULL */ - struct ItclMemberFunc *unused1; - Tcl_Resolve *resolvePtr; - Tcl_Obj *widgetClassPtr; /* class name for widget if class is a - * ::itcl::widget */ - Tcl_Obj *hullTypePtr; /* hulltype name for widget if class is a - * ::itcl::widget */ - Tcl_Object oPtr; /* TclOO class object */ - Tcl_Class clsPtr; /* TclOO class */ - int numCommons; /* number of commons in this class */ - int numVariables; /* number of variables in this class */ - int numOptions; /* number of options in this class */ - int unique; /* unique number for #auto generation */ - int flags; /* maintains class status */ - int callRefCount; /* prevent deleting of class if refcount>1 */ - Tcl_Obj *typeConstructorPtr; /* initialization for types */ - int destructorHasBeenCalled; /* prevent multiple invocations of destrcutor */ - int refCount; -} ItclClass; - -typedef struct ItclHierIter { - ItclClass *current; /* current position in hierarchy */ - Itcl_Stack stack; /* stack used for traversal */ -} ItclHierIter; - -#define ITCL_OBJECT_IS_DELETED 0x01 -#define ITCL_OBJECT_IS_DESTRUCTED 0x02 -#define ITCL_OBJECT_IS_DESTROYED 0x04 -#define ITCL_OBJECT_IS_RENAMED 0x08 -#define ITCL_OBJECT_CLASS_DESTRUCTED 0x10 -#define ITCL_TCLOO_OBJECT_IS_DELETED 0x20 -#define ITCL_OBJECT_DESTRUCT_ERROR 0x40 -#define ITCL_OBJECT_SHOULD_VARNS_DELETE 0x80 -#define ITCL_OBJECT_ROOT_METHOD 0x8000 - -/* - * Representation for each [incr Tcl] object. - */ -typedef struct ItclObject { - ItclClass *iclsPtr; /* most-specific class */ - Tcl_Command accessCmd; /* object access command */ - - Tcl_HashTable* constructed; /* temp storage used during construction */ - Tcl_HashTable* destructed; /* temp storage used during destruction */ - Tcl_HashTable objectVariables; - /* used for storing Tcl_Var entries for - * variable resolving, key is ivPtr of - * variable, value is varPtr */ - Tcl_HashTable objectOptions; /* definitions for all option members - in this object. Look up option namePtr - names and get back ItclOption* ptrs */ - Tcl_HashTable objectComponents; /* definitions for all component members - in this object. Look up component namePtr - names and get back ItclComponent* ptrs */ - Tcl_HashTable objectMethodVariables; - /* definitions for all methodvariable members - in this object. Look up methodvariable - namePtr names and get back - ItclMethodVariable* ptrs */ - Tcl_HashTable objectDelegatedOptions; - /* definitions for all delegated option - members in this object. Look up option - namePtr names and get back - ItclOption* ptrs */ - Tcl_HashTable objectDelegatedFunctions; - /* definitions for all delegated function - members in this object. Look up function - namePtr names and get back - ItclMemberFunc * ptrs */ - Tcl_HashTable contextCache; /* cache for function contexts */ - Tcl_Obj *namePtr; - Tcl_Obj *origNamePtr; /* the original name before any rename */ - Tcl_Obj *createNamePtr; /* the temp name before any rename - * mostly used for widgetadaptor - * because that hijackes the name - * often when installing the hull */ - Tcl_Interp *interp; - ItclObjectInfo *infoPtr; - Tcl_Obj *varNsNamePtr; - Tcl_Object oPtr; /* the TclOO object */ - Tcl_Resolve *resolvePtr; - int flags; - int callRefCount; /* prevent deleting of object if refcount > 1 */ - Tcl_Obj *hullWindowNamePtr; /* the window path name for the hull - * (before renaming in installhull) */ - int destructorHasBeenCalled; /* is set when the destructor is called - * to avoid callin destructor twice */ - int noComponentTrace; /* don't call component traces if - * setting components in DelegationInstall */ - int hadConstructorError; /* needed for multiple calls of CallItclObjectCmd */ - int refCount; -} ItclObject; - -#define ITCL_IGNORE_ERRS 0x002 /* useful for construction/destruction */ - -typedef struct ItclResolveInfo { - int flags; - ItclClass *iclsPtr; - ItclObject *ioPtr; -} ItclResolveInfo; - -#define ITCL_RESOLVE_CLASS 0x01 -#define ITCL_RESOLVE_OBJECT 0x02 - -/* - * Implementation for any code body in an [incr Tcl] class. - */ -typedef struct ItclMemberCode { - int flags; /* flags describing implementation */ - int argcount; /* number of args in arglist */ - int maxargcount; /* max number of args in arglist */ - Tcl_Obj *usagePtr; /* usage string for error messages */ - Tcl_Obj *argumentPtr; /* the function arguments */ - Tcl_Obj *bodyPtr; /* the function body */ - ItclArgList *argListPtr; /* the parsed arguments */ - union { - Tcl_CmdProc *argCmd; /* (argc,argv) C implementation */ - Tcl_ObjCmdProc *objCmd; /* (objc,objv) C implementation */ - } cfunc; - ClientData clientData; /* client data for C implementations */ -} ItclMemberCode; - -/* - * Flag bits for ItclMemberCode: - */ -#define ITCL_IMPLEMENT_NONE 0x001 /* no implementation */ -#define ITCL_IMPLEMENT_TCL 0x002 /* Tcl implementation */ -#define ITCL_IMPLEMENT_ARGCMD 0x004 /* (argc,argv) C implementation */ -#define ITCL_IMPLEMENT_OBJCMD 0x008 /* (objc,objv) C implementation */ -#define ITCL_IMPLEMENT_C 0x00c /* either kind of C implementation */ - -#define Itcl_IsMemberCodeImplemented(mcode) \ - (((mcode)->flags & ITCL_IMPLEMENT_NONE) == 0) - -/* - * Flag bits for ItclMember: functions and variables - */ -#define ITCL_COMMON 0x010 /* non-zero => is a "proc" or common - * variable */ - -/* - * Flag bits for ItclMember: functions - */ -#define ITCL_CONSTRUCTOR 0x020 /* non-zero => is a constructor */ -#define ITCL_DESTRUCTOR 0x040 /* non-zero => is a destructor */ -#define ITCL_ARG_SPEC 0x080 /* non-zero => has an argument spec */ -#define ITCL_BODY_SPEC 0x100 /* non-zero => has an body spec */ -#define ITCL_BUILTIN 0x400 /* non-zero => built-in method */ -#define ITCL_COMPONENT 0x800 /* non-zero => component */ -#define ITCL_TYPE_METHOD 0x1000 /* non-zero => typemethod */ -#define ITCL_METHOD 0x2000 /* non-zero => method */ - -/* - * Flag bits for ItclMember: variables - */ -#define ITCL_THIS_VAR 0x20 /* non-zero => built-in "this" variable */ -#define ITCL_OPTIONS_VAR 0x40 /* non-zero => built-in "itcl_options" - * variable */ -#define ITCL_TYPE_VAR 0x80 /* non-zero => built-in "type" variable */ - /* no longer used ??? */ -#define ITCL_SELF_VAR 0x100 /* non-zero => built-in "self" variable */ -#define ITCL_SELFNS_VAR 0x200 /* non-zero => built-in "selfns" - * variable */ -#define ITCL_WIN_VAR 0x400 /* non-zero => built-in "win" variable */ -#define ITCL_COMPONENT_VAR 0x800 /* non-zero => component variable */ -#define ITCL_HULL_VAR 0x1000 /* non-zero => built-in "itcl_hull" - * variable */ -#define ITCL_OPTION_READONLY 0x2000 /* non-zero => readonly */ -#define ITCL_VARIABLE 0x4000 /* non-zero => normal variable */ -#define ITCL_TYPE_VARIABLE 0x8000 /* non-zero => typevariable */ -#define ITCL_OPTION_INITTED 0x10000 /* non-zero => option has been initialized */ -#define ITCL_OPTION_COMP_VAR 0x20000 /* variable to collect option components of extendedclass */ - -/* - * Instance components. - */ -struct ItclVariable; -typedef struct ItclComponent { - Tcl_Obj *namePtr; /* member name */ - struct ItclVariable *ivPtr; /* variable for this component */ - int flags; - int haveKeptOptions; - Tcl_HashTable keptOptions; /* table of options to keep */ -} ItclComponent; - -#define ITCL_COMPONENT_INHERIT 0x01 -#define ITCL_COMPONENT_PUBLIC 0x02 - -typedef struct ItclDelegatedFunction { - Tcl_Obj *namePtr; - ItclComponent *icPtr; - Tcl_Obj *asPtr; - Tcl_Obj *usingPtr; - Tcl_HashTable exceptions; - int flags; -} ItclDelegatedFunction; - -/* - * Representation of member functions in an [incr Tcl] class. - */ -typedef struct ItclMemberFunc { - Tcl_Obj* namePtr; /* member name */ - Tcl_Obj* fullNamePtr; /* member name with "class::" qualifier */ - ItclClass* iclsPtr; /* class containing this member */ - int protection; /* protection level */ - int flags; /* flags describing member (see above) */ - ItclObjectInfo *infoPtr; - ItclMemberCode *codePtr; /* code associated with member */ - Tcl_Command accessCmd; /* Tcl command installed for this function */ - int argcount; /* number of args in arglist */ - int maxargcount; /* max number of args in arglist */ - Tcl_Obj *usagePtr; /* usage string for error messages */ - Tcl_Obj *argumentPtr; /* the function arguments */ - Tcl_Obj *builtinArgumentPtr; /* the function arguments for builtin functions */ - Tcl_Obj *origArgsPtr; /* the argument string of the original definition */ - Tcl_Obj *bodyPtr; /* the function body */ - ItclArgList *argListPtr; /* the parsed arguments */ - ItclClass *declaringClassPtr; /* the class which declared the method/proc */ - ClientData tmPtr; /* TclOO methodPtr */ - ItclDelegatedFunction *idmPtr; - /* if the function is delegated != NULL */ - int refCount; -} ItclMemberFunc; - -/* - * Instance variables. - */ -typedef struct ItclVariable { - Tcl_Obj *namePtr; /* member name */ - Tcl_Obj *fullNamePtr; /* member name with "class::" qualifier */ - ItclClass *iclsPtr; /* class containing this member */ - ItclObjectInfo *infoPtr; - ItclMemberCode *codePtr; /* code associated with member */ - Tcl_Obj *init; /* initial value */ - Tcl_Obj *arrayInitPtr; /* initial value if variable should be array */ - int protection; /* protection level */ - int flags; /* flags describing member (see below) */ - int initted; /* is set when first time initted, to check - * for example itcl_hull var, which can be only - * initialized once */ -} ItclVariable; - - -struct ItclOption; - -typedef struct ItclDelegatedOption { - Tcl_Obj *namePtr; - Tcl_Obj *resourceNamePtr; - Tcl_Obj *classNamePtr; - struct ItclOption *ioptPtr; /* the option name or null for "*" */ - ItclComponent *icPtr; /* the component where the delegation goes - * to */ - Tcl_Obj *asPtr; - Tcl_HashTable exceptions; /* exceptions from delegation */ -} ItclDelegatedOption; - -/* - * Instance options. - */ -typedef struct ItclOption { - /* within a class hierarchy there must be only - * one option with the same name !! */ - Tcl_Obj *namePtr; /* member name */ - Tcl_Obj *fullNamePtr; /* member name with "class::" qualifier */ - Tcl_Obj *resourceNamePtr; - Tcl_Obj *classNamePtr; - ItclClass *iclsPtr; /* class containing this member */ - int protection; /* protection level */ - int flags; /* flags describing member (see below) */ - ItclMemberCode *codePtr; /* code associated with member */ - Tcl_Obj *defaultValuePtr; /* initial value */ - Tcl_Obj *cgetMethodPtr; - Tcl_Obj *cgetMethodVarPtr; - Tcl_Obj *configureMethodPtr; - Tcl_Obj *configureMethodVarPtr; - Tcl_Obj *validateMethodPtr; - Tcl_Obj *validateMethodVarPtr; - ItclDelegatedOption *idoPtr; - /* if the option is delegated != NULL */ -} ItclOption; - -/* - * Instance methodvariables. - */ -typedef struct ItclMethodVariable { - Tcl_Obj *namePtr; /* member name */ - Tcl_Obj *fullNamePtr; /* member name with "class::" qualifier */ - ItclClass *iclsPtr; /* class containing this member */ - int protection; /* protection level */ - int flags; /* flags describing member (see below) */ - Tcl_Obj *defaultValuePtr; - Tcl_Obj *callbackPtr; -} ItclMethodVariable; - -#define VAR_TYPE_VARIABLE 1 -#define VAR_TYPE_COMMON 2 - -typedef struct ItclClassVarInfo { - int type; - int protection; - int varNum; - Tcl_Namespace *nsPtr; - Tcl_Namespace *declaringNsPtr; -} ItclClassVarInfo; - -#define CMD_TYPE_METHOD 1 -#define CMD_TYPE_PROC 2 - -typedef struct ItclClassCmdInfo { - int type; - int protection; - int cmdNum; - Tcl_Namespace *nsPtr; - Tcl_Namespace *declaringNsPtr; -} ItclClassCmdInfo; - -/* - * Instance variable lookup entry. - */ -typedef struct ItclVarLookup { - ItclVariable* ivPtr; /* variable definition */ - int usage; /* number of uses for this record */ - int accessible; /* non-zero => accessible from class with - * this lookup record in its resolveVars */ - char *leastQualName; /* simplist name for this variable, with - * the fewest qualifiers. This string is - * taken from the resolveVars table, so - * it shouldn't be freed. */ - int varNum; - ItclClassVarInfo *classVarInfoPtr; - Tcl_Var varPtr; -} ItclVarLookup; - -/* - * Instance command lookup entry. - */ -typedef struct ItclCmdLookup { - ItclMemberFunc* imPtr; /* function definition */ - int cmdNum; - ItclClassCmdInfo *classCmdInfoPtr; - Tcl_Command cmdPtr; -} ItclCmdLookup; - -typedef struct ItclCallContext { - int objectFlags; - Tcl_Namespace *nsPtr; - ItclObject *ioPtr; - ItclMemberFunc *imPtr; - int refCount; -} ItclCallContext; - -/* - * The macro below is used to modify a "char" value (e.g. by casting - * it to an unsigned character) so that it can be used safely with - * macros such as isspace. - */ - -#define UCHAR(c) ((unsigned char) (c)) -/* - * Macros used to cast between pointers and integers (e.g. when storing an int - * in ClientData), on 64-bit architectures they avoid gcc warning about "cast - * to/from pointer from/to integer of different size". - */ - -#if !defined(INT2PTR) && !defined(PTR2INT) -# if defined(HAVE_INTPTR_T) || defined(intptr_t) -# define INT2PTR(p) ((void*)(intptr_t)(p)) -# define PTR2INT(p) ((int)(intptr_t)(p)) -# else -# define INT2PTR(p) ((void*)(p)) -# define PTR2INT(p) ((int)(p)) -# endif -#endif - -#ifdef ITCL_DEBUG -MODULE_SCOPE int _itcl_debug_level; -MODULE_SCOPE void ItclShowArgs(int level, const char *str, int objc, - Tcl_Obj * const* objv); -#else -#define ItclShowArgs(a,b,c,d) -#endif - -MODULE_SCOPE Tcl_ObjCmdProc ItclCallCCommand; -MODULE_SCOPE Tcl_ObjCmdProc ItclObjectUnknownCommand; -MODULE_SCOPE int ItclCheckCallProc(ClientData clientData, Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, Tcl_CallFrame *framePtr, int *isFinished); - -MODULE_SCOPE void ItclPreserveIMF(ItclMemberFunc *imPtr); -MODULE_SCOPE void ItclReleaseIMF(ClientData imPtr); - -MODULE_SCOPE void ItclPreserveClass(ItclClass *iclsPtr); -MODULE_SCOPE void ItclReleaseClass(ClientData iclsPtr); - -MODULE_SCOPE void ItclPreserveObject(ItclObject *ioPtr); -MODULE_SCOPE void ItclReleaseObject(ClientData ioPtr); - -MODULE_SCOPE ItclFoundation *ItclGetFoundation(Tcl_Interp *interp); -MODULE_SCOPE Tcl_ObjCmdProc ItclClassCommandDispatcher; -MODULE_SCOPE Tcl_Command Itcl_CmdAliasProc(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *cmdName, ClientData clientData); -MODULE_SCOPE Tcl_Var Itcl_VarAliasProc(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *VarName, ClientData clientData); -MODULE_SCOPE int ItclIsClass(Tcl_Interp *interp, Tcl_Command cmd); -MODULE_SCOPE int ItclCheckCallMethod(ClientData clientData, Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, Tcl_CallFrame *framePtr, int *isFinished); -MODULE_SCOPE int ItclAfterCallMethod(ClientData clientData, Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, Tcl_Namespace *nsPtr, int result); -MODULE_SCOPE void ItclReportObjectUsage(Tcl_Interp *interp, - ItclObject *contextIoPtr, Tcl_Namespace *callerNsPtr, - Tcl_Namespace *contextNsPtr); -MODULE_SCOPE int ItclMapMethodNameProc(Tcl_Interp *interp, Tcl_Object oPtr, - Tcl_Class *startClsPtr, Tcl_Obj *methodObj); -MODULE_SCOPE int ItclCreateArgList(Tcl_Interp *interp, const char *str, - int *argcPtr, int *maxArgcPtr, Tcl_Obj **usagePtr, - ItclArgList **arglistPtrPtr, ItclMemberFunc *imPtr, - const char *commandName); -MODULE_SCOPE int ItclObjectCmd(ClientData clientData, Tcl_Interp *interp, - Tcl_Object oPtr, Tcl_Class clsPtr, int objc, Tcl_Obj *const *objv); -MODULE_SCOPE int ItclCreateObject (Tcl_Interp *interp, const char* name, - ItclClass *iclsPtr, int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE void ItclDeleteObjectVariablesNamespace(Tcl_Interp *interp, - ItclObject *ioPtr); -MODULE_SCOPE void ItclDeleteClassVariablesNamespace(Tcl_Interp *interp, - ItclClass *iclsPtr); -MODULE_SCOPE int ItclInfoInit(Tcl_Interp *interp, ItclObjectInfo *infoPtr); - -struct Tcl_ResolvedVarInfo; -MODULE_SCOPE int Itcl_ClassCmdResolver(Tcl_Interp *interp, const char* name, - Tcl_Namespace *nsPtr, int flags, Tcl_Command *rPtr); -MODULE_SCOPE int Itcl_ClassVarResolver(Tcl_Interp *interp, const char* name, - Tcl_Namespace *nsPtr, int flags, Tcl_Var *rPtr); -MODULE_SCOPE int Itcl_ClassCompiledVarResolver(Tcl_Interp *interp, - const char* name, int length, Tcl_Namespace *nsPtr, - struct Tcl_ResolvedVarInfo **rPtr); -MODULE_SCOPE int Itcl_ClassCmdResolver2(Tcl_Interp *interp, const char* name, - Tcl_Namespace *nsPtr, int flags, Tcl_Command *rPtr); -MODULE_SCOPE int Itcl_ClassVarResolver2(Tcl_Interp *interp, const char* name, - Tcl_Namespace *nsPtr, int flags, Tcl_Var *rPtr); -MODULE_SCOPE int Itcl_ClassCompiledVarResolver2(Tcl_Interp *interp, - const char* name, int length, Tcl_Namespace *nsPtr, - struct Tcl_ResolvedVarInfo **rPtr); -MODULE_SCOPE int ItclSetParserResolver(Tcl_Namespace *nsPtr); -MODULE_SCOPE void ItclProcErrorProc(Tcl_Interp *interp, Tcl_Obj *procNameObj); -MODULE_SCOPE int Itcl_CreateOption (Tcl_Interp *interp, ItclClass *iclsPtr, - ItclOption *ioptPtr); -MODULE_SCOPE int Itcl_CreateMethodVariable (Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *name, Tcl_Obj *defaultPtr, - Tcl_Obj *callbackPtr, ItclMethodVariable **imvPtr); -MODULE_SCOPE int DelegationInstall(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr); -MODULE_SCOPE ItclClass *ItclNamespace2Class(Tcl_Namespace *nsPtr); -MODULE_SCOPE const char* ItclGetCommonInstanceVar(Tcl_Interp *interp, - const char *name, const char *name2, ItclObject *contextIoPtr, - ItclClass *contextIclsPtr); -MODULE_SCOPE int ItclCreateMethod(Tcl_Interp* interp, ItclClass *iclsPtr, - Tcl_Obj *namePtr, const char* arglist, const char* body, - ItclMemberFunc **imPtrPtr); -MODULE_SCOPE int Itcl_WidgetParseInit(Tcl_Interp *interp, - ItclObjectInfo *infoPtr); -MODULE_SCOPE void ItclDeleteObjectMetadata(ClientData clientData); -MODULE_SCOPE void ItclDeleteClassMetadata(ClientData clientData); -MODULE_SCOPE void ItclDeleteArgList(ItclArgList *arglistPtr); -MODULE_SCOPE int Itcl_ClassOptionCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE int DelegatedOptionsInstall(Tcl_Interp *interp, - ItclClass *iclsPtr); -MODULE_SCOPE int Itcl_HandleDelegateOptionCmd(Tcl_Interp *interp, - ItclObject *ioPtr, ItclClass *iclsPtr, ItclDelegatedOption **idoPtrPtr, - int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE int Itcl_HandleDelegateMethodCmd(Tcl_Interp *interp, - ItclObject *ioPtr, ItclClass *iclsPtr, - ItclDelegatedFunction **idmPtrPtr, int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE int DelegateFunction(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr, Tcl_Obj *componentNamePtr, - ItclDelegatedFunction *idmPtr); -MODULE_SCOPE int ItclInitObjectMethodVariables(Tcl_Interp *interp, - ItclObject *ioPtr, ItclClass *iclsPtr, const char *name); -MODULE_SCOPE int InitTclOOFunctionPointers(Tcl_Interp *interp); -MODULE_SCOPE ItclOption* ItclNewOption(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr, Tcl_Obj *namePtr, const char *resourceName, - const char *className, char *init, ItclMemberCode *mCodePtr); -MODULE_SCOPE int ItclParseOption(ItclObjectInfo *infoPtr, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[], ItclClass *iclsPtr, - ItclObject *ioPtr, ItclOption **ioptPtrPtr); -MODULE_SCOPE void ItclDestroyClassNamesp(ClientData cdata); -MODULE_SCOPE int ExpandDelegateAs(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr, ItclDelegatedFunction *idmPtr, - const char *funcName, Tcl_Obj *listPtr); -MODULE_SCOPE int ItclCheckForInitializedComponents(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclObject *ioPtr); -MODULE_SCOPE int ItclCreateDelegatedFunction(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *methodNamePtr, ItclComponent *icPtr, - Tcl_Obj *targetPtr, Tcl_Obj *usingPtr, Tcl_Obj *exceptionsPtr, - ItclDelegatedFunction **idmPtrPtr); -MODULE_SCOPE void ItclDeleteDelegatedOption(char *cdata); -MODULE_SCOPE void Itcl_FinishList(); -MODULE_SCOPE void ItclDeleteDelegatedFunction(ItclDelegatedFunction *idmPtr); -MODULE_SCOPE void ItclFinishEnsemble(ItclObjectInfo *infoPtr); -MODULE_SCOPE int Itcl_EnsembleDeleteCmd(ClientData clientData, - Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE int ItclAddClassesDictInfo(Tcl_Interp *interp, ItclClass *iclsPtr); -MODULE_SCOPE int ItclDeleteClassesDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr); -MODULE_SCOPE int ItclAddObjectsDictInfo(Tcl_Interp *interp, ItclObject *ioPtr); -MODULE_SCOPE int ItclDeleteObjectsDictInfo(Tcl_Interp *interp, - ItclObject *ioPtr); -MODULE_SCOPE int ItclAddOptionDictInfo(Tcl_Interp *interp, ItclClass *iclsPtr, - ItclOption *ioptPtr); -MODULE_SCOPE int ItclAddDelegatedOptionDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclDelegatedOption *idoPtr); -MODULE_SCOPE int ItclAddClassComponentDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclComponent *icPtr); -MODULE_SCOPE int ItclAddClassVariableDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclVariable *ivPtr); -MODULE_SCOPE int ItclAddClassFunctionDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclMemberFunc *imPtr); -MODULE_SCOPE int ItclAddClassDelegatedFunctionDictInfo(Tcl_Interp *interp, - ItclClass *iclsPtr, ItclDelegatedFunction *idmPtr); -MODULE_SCOPE int ItclClassCreateObject(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiMyProcCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiInstallComponentCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiCallInstanceCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiGetInstanceVarCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiMyTypeMethodCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiMyMethodCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiMyTypeVarCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiMyVarCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_BiItclHullCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_ThisCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_ExtendedClassCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_TypeClassCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_AddObjectOptionCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_AddDelegatedOptionCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_AddDelegatedFunctionCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_SetComponentCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_ClassHullTypeCmd; -MODULE_SCOPE Tcl_ObjCmdProc Itcl_ClassWidgetClassCmd; - -typedef int (ItclRootMethodProc)(ItclObject *ioPtr, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); - -MODULE_SCOPE const Tcl_MethodType itclRootMethodType; -MODULE_SCOPE ItclRootMethodProc ItclUnknownGuts; -MODULE_SCOPE ItclRootMethodProc ItclConstructGuts; -MODULE_SCOPE ItclRootMethodProc ItclInfoGuts; - -#include "itcl2TclOO.h" -#ifdef NEW_PROTO_RESOLVER -#include "itclVarsAndCmds.h" -#endif - -/* - * Include all the private API, generated from itcl.decls. - */ - -#include "itclIntDecls.h" diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclIntDecls.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclIntDecls.h deleted file mode 100644 index 5c68fb3..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclIntDecls.h +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * This file is (mostly) automatically generated from itcl.decls. - */ - -#ifndef _ITCLINTDECLS -#define _ITCLINTDECLS - -/* !BEGIN!: Do not edit below this line. */ - -#define ITCLINT_STUBS_EPOCH 0 -#define ITCLINT_STUBS_REVISION 150 - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Exported function declarations: - */ - -/* 0 */ -ITCLAPI int Itcl_IsClassNamespace(Tcl_Namespace *namesp); -/* 1 */ -ITCLAPI int Itcl_IsClass(Tcl_Command cmd); -/* 2 */ -ITCLAPI ItclClass * Itcl_FindClass(Tcl_Interp *interp, const char *path, - int autoload); -/* 3 */ -ITCLAPI int Itcl_FindObject(Tcl_Interp *interp, const char *name, - ItclObject **roPtr); -/* 4 */ -ITCLAPI int Itcl_IsObject(Tcl_Command cmd); -/* 5 */ -ITCLAPI int Itcl_ObjectIsa(ItclObject *contextObj, - ItclClass *cdefn); -/* 6 */ -ITCLAPI int Itcl_Protection(Tcl_Interp *interp, int newLevel); -/* 7 */ -ITCLAPI const char * Itcl_ProtectionStr(int pLevel); -/* 8 */ -ITCLAPI int Itcl_CanAccess(ItclMemberFunc *memberPtr, - Tcl_Namespace *fromNsPtr); -/* 9 */ -ITCLAPI int Itcl_CanAccessFunc(ItclMemberFunc *mfunc, - Tcl_Namespace *fromNsPtr); -/* Slot 10 is reserved */ -/* 11 */ -ITCLAPI void Itcl_ParseNamespPath(const char *name, - Tcl_DString *buffer, const char **head, - const char **tail); -/* 12 */ -ITCLAPI int Itcl_DecodeScopedCommand(Tcl_Interp *interp, - const char *name, Tcl_Namespace **rNsPtr, - char **rCmdPtr); -/* 13 */ -ITCLAPI int Itcl_EvalArgs(Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 14 */ -ITCLAPI Tcl_Obj * Itcl_CreateArgs(Tcl_Interp *interp, - const char *string, int objc, - Tcl_Obj *const objv[]); -/* Slot 15 is reserved */ -/* Slot 16 is reserved */ -/* 17 */ -ITCLAPI int Itcl_GetContext(Tcl_Interp *interp, - ItclClass **iclsPtrPtr, - ItclObject **ioPtrPtr); -/* 18 */ -ITCLAPI void Itcl_InitHierIter(ItclHierIter *iter, - ItclClass *iclsPtr); -/* 19 */ -ITCLAPI void Itcl_DeleteHierIter(ItclHierIter *iter); -/* 20 */ -ITCLAPI ItclClass * Itcl_AdvanceHierIter(ItclHierIter *iter); -/* 21 */ -ITCLAPI int Itcl_FindClassesCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 22 */ -ITCLAPI int Itcl_FindObjectsCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 23 is reserved */ -/* 24 */ -ITCLAPI int Itcl_DelClassCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 25 */ -ITCLAPI int Itcl_DelObjectCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 26 */ -ITCLAPI int Itcl_ScopeCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 27 */ -ITCLAPI int Itcl_CodeCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 28 */ -ITCLAPI int Itcl_StubCreateCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 29 */ -ITCLAPI int Itcl_StubExistsCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 30 */ -ITCLAPI int Itcl_IsStub(Tcl_Command cmd); -/* 31 */ -ITCLAPI int Itcl_CreateClass(Tcl_Interp *interp, - const char *path, ItclObjectInfo *info, - ItclClass **rPtr); -/* 32 */ -ITCLAPI int Itcl_DeleteClass(Tcl_Interp *interp, - ItclClass *iclsPtr); -/* 33 */ -ITCLAPI Tcl_Namespace * Itcl_FindClassNamespace(Tcl_Interp *interp, - const char *path); -/* 34 */ -ITCLAPI int Itcl_HandleClass(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 35 is reserved */ -/* Slot 36 is reserved */ -/* Slot 37 is reserved */ -/* 38 */ -ITCLAPI void Itcl_BuildVirtualTables(ItclClass *iclsPtr); -/* 39 */ -ITCLAPI int Itcl_CreateVariable(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *name, - char *init, char *config, - ItclVariable **ivPtr); -/* 40 */ -ITCLAPI void Itcl_DeleteVariable(char *cdata); -/* 41 */ -ITCLAPI const char * Itcl_GetCommonVar(Tcl_Interp *interp, - const char *name, ItclClass *contextClass); -/* Slot 42 is reserved */ -/* Slot 43 is reserved */ -/* 44 */ -ITCLAPI int Itcl_CreateObject(Tcl_Interp *interp, - const char*name, ItclClass *iclsPtr, - int objc, Tcl_Obj *const objv[], - ItclObject **rioPtr); -/* 45 */ -ITCLAPI int Itcl_DeleteObject(Tcl_Interp *interp, - ItclObject *contextObj); -/* 46 */ -ITCLAPI int Itcl_DestructObject(Tcl_Interp *interp, - ItclObject *contextObj, int flags); -/* Slot 47 is reserved */ -/* 48 */ -ITCLAPI const char * Itcl_GetInstanceVar(Tcl_Interp *interp, - const char *name, ItclObject *contextIoPtr, - ItclClass *contextIclsPtr); -/* Slot 49 is reserved */ -/* 50 */ -ITCLAPI int Itcl_BodyCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); -/* 51 */ -ITCLAPI int Itcl_ConfigBodyCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 52 */ -ITCLAPI int Itcl_CreateMethod(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *namePtr, - const char *arglist, const char *body); -/* 53 */ -ITCLAPI int Itcl_CreateProc(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *namePtr, - const char *arglist, const char *body); -/* 54 */ -ITCLAPI int Itcl_CreateMemberFunc(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *name, - const char *arglist, const char *body, - ItclMemberFunc **mfuncPtr); -/* 55 */ -ITCLAPI int Itcl_ChangeMemberFunc(Tcl_Interp *interp, - ItclMemberFunc *mfunc, const char *arglist, - const char *body); -/* 56 */ -ITCLAPI void Itcl_DeleteMemberFunc(char *cdata); -/* 57 */ -ITCLAPI int Itcl_CreateMemberCode(Tcl_Interp *interp, - ItclClass *iclsPtr, const char *arglist, - const char *body, ItclMemberCode **mcodePtr); -/* 58 */ -ITCLAPI void Itcl_DeleteMemberCode(char *cdata); -/* 59 */ -ITCLAPI int Itcl_GetMemberCode(Tcl_Interp *interp, - ItclMemberFunc *mfunc); -/* Slot 60 is reserved */ -/* 61 */ -ITCLAPI int Itcl_EvalMemberCode(Tcl_Interp *interp, - ItclMemberFunc *mfunc, - ItclObject *contextObj, int objc, - Tcl_Obj *const objv[]); -/* Slot 62 is reserved */ -/* Slot 63 is reserved */ -/* Slot 64 is reserved */ -/* Slot 65 is reserved */ -/* Slot 66 is reserved */ -/* 67 */ -ITCLAPI void Itcl_GetMemberFuncUsage(ItclMemberFunc *mfunc, - ItclObject *contextObj, Tcl_Obj *objPtr); -/* 68 */ -ITCLAPI int Itcl_ExecMethod(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 69 */ -ITCLAPI int Itcl_ExecProc(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 70 is reserved */ -/* 71 */ -ITCLAPI int Itcl_ConstructBase(Tcl_Interp *interp, - ItclObject *contextObj, - ItclClass *contextClass); -/* 72 */ -ITCLAPI int Itcl_InvokeMethodIfExists(Tcl_Interp *interp, - const char *name, ItclClass *contextClass, - ItclObject *contextObj, int objc, - Tcl_Obj *const objv[]); -/* Slot 73 is reserved */ -/* 74 */ -ITCLAPI int Itcl_ReportFuncErrors(Tcl_Interp *interp, - ItclMemberFunc *mfunc, - ItclObject *contextObj, int result); -/* 75 */ -ITCLAPI int Itcl_ParseInit(Tcl_Interp *interp, - ItclObjectInfo *info); -/* 76 */ -ITCLAPI int Itcl_ClassCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 77 */ -ITCLAPI int Itcl_ClassInheritCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 78 */ -ITCLAPI int Itcl_ClassProtectionCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 79 */ -ITCLAPI int Itcl_ClassConstructorCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 80 */ -ITCLAPI int Itcl_ClassDestructorCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 81 */ -ITCLAPI int Itcl_ClassMethodCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 82 */ -ITCLAPI int Itcl_ClassProcCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 83 */ -ITCLAPI int Itcl_ClassVariableCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 84 */ -ITCLAPI int Itcl_ClassCommonCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 85 */ -ITCLAPI int Itcl_ParseVarResolver(Tcl_Interp *interp, - const char *name, Tcl_Namespace *contextNs, - int flags, Tcl_Var *rPtr); -/* 86 */ -ITCLAPI int Itcl_BiInit(Tcl_Interp *interp, - ItclObjectInfo *infoPtr); -/* 87 */ -ITCLAPI int Itcl_InstallBiMethods(Tcl_Interp *interp, - ItclClass *cdefn); -/* 88 */ -ITCLAPI int Itcl_BiIsaCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 89 */ -ITCLAPI int Itcl_BiConfigureCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 90 */ -ITCLAPI int Itcl_BiCgetCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 91 */ -ITCLAPI int Itcl_BiChainCmd(ClientData dummy, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); -/* 92 */ -ITCLAPI int Itcl_BiInfoClassCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 93 */ -ITCLAPI int Itcl_BiInfoInheritCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 94 */ -ITCLAPI int Itcl_BiInfoHeritageCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 95 */ -ITCLAPI int Itcl_BiInfoFunctionCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 96 */ -ITCLAPI int Itcl_BiInfoVariableCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 97 */ -ITCLAPI int Itcl_BiInfoBodyCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 98 */ -ITCLAPI int Itcl_BiInfoArgsCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 99 is reserved */ -/* 100 */ -ITCLAPI int Itcl_EnsembleInit(Tcl_Interp *interp); -/* 101 */ -ITCLAPI int Itcl_CreateEnsemble(Tcl_Interp *interp, - const char *ensName); -/* 102 */ -ITCLAPI int Itcl_AddEnsemblePart(Tcl_Interp *interp, - const char *ensName, const char *partName, - const char *usageInfo, - Tcl_ObjCmdProc *objProc, - ClientData clientData, - Tcl_CmdDeleteProc *deleteProc); -/* 103 */ -ITCLAPI int Itcl_GetEnsemblePart(Tcl_Interp *interp, - const char *ensName, const char *partName, - Tcl_CmdInfo *infoPtr); -/* 104 */ -ITCLAPI int Itcl_IsEnsemble(Tcl_CmdInfo *infoPtr); -/* 105 */ -ITCLAPI int Itcl_GetEnsembleUsage(Tcl_Interp *interp, - const char *ensName, Tcl_Obj *objPtr); -/* 106 */ -ITCLAPI int Itcl_GetEnsembleUsageForObj(Tcl_Interp *interp, - Tcl_Obj *ensObjPtr, Tcl_Obj *objPtr); -/* 107 */ -ITCLAPI int Itcl_EnsembleCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 108 */ -ITCLAPI int Itcl_EnsPartCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 109 */ -ITCLAPI int Itcl_EnsembleErrorCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 110 is reserved */ -/* Slot 111 is reserved */ -/* Slot 112 is reserved */ -/* Slot 113 is reserved */ -/* Slot 114 is reserved */ -/* 115 */ -ITCLAPI void Itcl_Assert(const char *testExpr, - const char *fileName, int lineNum); -/* 116 */ -ITCLAPI int Itcl_IsObjectCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 117 */ -ITCLAPI int Itcl_IsClassCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 118 is reserved */ -/* Slot 119 is reserved */ -/* Slot 120 is reserved */ -/* Slot 121 is reserved */ -/* Slot 122 is reserved */ -/* Slot 123 is reserved */ -/* Slot 124 is reserved */ -/* Slot 125 is reserved */ -/* Slot 126 is reserved */ -/* Slot 127 is reserved */ -/* Slot 128 is reserved */ -/* Slot 129 is reserved */ -/* Slot 130 is reserved */ -/* Slot 131 is reserved */ -/* Slot 132 is reserved */ -/* Slot 133 is reserved */ -/* Slot 134 is reserved */ -/* Slot 135 is reserved */ -/* Slot 136 is reserved */ -/* Slot 137 is reserved */ -/* Slot 138 is reserved */ -/* Slot 139 is reserved */ -/* 140 */ -ITCLAPI int Itcl_FilterAddCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 141 */ -ITCLAPI int Itcl_FilterDeleteCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 142 */ -ITCLAPI int Itcl_ForwardAddCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 143 */ -ITCLAPI int Itcl_ForwardDeleteCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 144 */ -ITCLAPI int Itcl_MixinAddCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 145 */ -ITCLAPI int Itcl_MixinDeleteCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* Slot 146 is reserved */ -/* Slot 147 is reserved */ -/* Slot 148 is reserved */ -/* Slot 149 is reserved */ -/* Slot 150 is reserved */ -/* 151 */ -ITCLAPI int Itcl_BiInfoUnknownCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 152 */ -ITCLAPI int Itcl_BiInfoVarsCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 153 */ -ITCLAPI int Itcl_CanAccess2(ItclClass *iclsPtr, int protection, - Tcl_Namespace *fromNsPtr); -/* Slot 154 is reserved */ -/* Slot 155 is reserved */ -/* Slot 156 is reserved */ -/* Slot 157 is reserved */ -/* Slot 158 is reserved */ -/* Slot 159 is reserved */ -/* 160 */ -ITCLAPI int Itcl_SetCallFrameResolver(Tcl_Interp *interp, - Tcl_Resolve *resolvePtr); -/* 161 */ -ITCLAPI int ItclEnsembleSubCmd(ClientData clientData, - Tcl_Interp *interp, const char *ensembleName, - int objc, Tcl_Obj *const *objv, - const char *functionName); -/* 162 */ -ITCLAPI Tcl_Namespace * Itcl_GetUplevelNamespace(Tcl_Interp *interp, - int level); -/* 163 */ -ITCLAPI ClientData Itcl_GetCallFrameClientData(Tcl_Interp *interp); -/* Slot 164 is reserved */ -/* 165 */ -ITCLAPI int Itcl_SetCallFrameNamespace(Tcl_Interp *interp, - Tcl_Namespace *nsPtr); -/* 166 */ -ITCLAPI int Itcl_GetCallFrameObjc(Tcl_Interp *interp); -/* 167 */ -ITCLAPI Tcl_Obj *const * Itcl_GetCallFrameObjv(Tcl_Interp *interp); -/* 168 */ -ITCLAPI int Itcl_NWidgetCmd(ClientData infoPtr, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 169 */ -ITCLAPI int Itcl_AddOptionCmd(ClientData infoPtr, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 170 */ -ITCLAPI int Itcl_AddComponentCmd(ClientData infoPtr, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 171 */ -ITCLAPI int Itcl_BiInfoOptionCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 172 */ -ITCLAPI int Itcl_BiInfoComponentCmd(ClientData dummy, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); -/* 173 */ -ITCLAPI int Itcl_RenameCommand(Tcl_Interp *interp, - const char *oldName, const char *newName); -/* 174 */ -ITCLAPI int Itcl_PushCallFrame(Tcl_Interp *interp, - Tcl_CallFrame *framePtr, - Tcl_Namespace *nsPtr, int isProcCallFrame); -/* 175 */ -ITCLAPI void Itcl_PopCallFrame(Tcl_Interp *interp); -/* 176 */ -ITCLAPI Tcl_CallFrame * Itcl_GetUplevelCallFrame(Tcl_Interp *interp, - int level); -/* 177 */ -ITCLAPI Tcl_CallFrame * Itcl_ActivateCallFrame(Tcl_Interp *interp, - Tcl_CallFrame *framePtr); -/* 178 */ -ITCLAPI const char* ItclSetInstanceVar(Tcl_Interp *interp, - const char *name, const char *name2, - const char *value, ItclObject *contextIoPtr, - ItclClass *contextIclsPtr); -/* 179 */ -ITCLAPI Tcl_Obj * ItclCapitalize(const char *str); -/* 180 */ -ITCLAPI int ItclClassBaseCmd(ClientData clientData, - Tcl_Interp *interp, int flags, int objc, - Tcl_Obj *const objv[], - ItclClass **iclsPtrPtr); -/* 181 */ -ITCLAPI int ItclCreateComponent(Tcl_Interp *interp, - ItclClass *iclsPtr, Tcl_Obj *componentPtr, - int type, ItclComponent **icPtrPtr); -/* 182 */ -ITCLAPI void Itcl_SetContext(Tcl_Interp *interp, - ItclObject *ioPtr); -/* 183 */ -ITCLAPI void Itcl_UnsetContext(Tcl_Interp *interp); -/* 184 */ -ITCLAPI const char * ItclGetInstanceVar(Tcl_Interp *interp, - const char *name, const char *name2, - ItclObject *ioPtr, ItclClass *iclsPtr); - -typedef struct ItclIntStubs { - int magic; - int epoch; - int revision; - void *hooks; - - int (*itcl_IsClassNamespace) (Tcl_Namespace *namesp); /* 0 */ - int (*itcl_IsClass) (Tcl_Command cmd); /* 1 */ - ItclClass * (*itcl_FindClass) (Tcl_Interp *interp, const char *path, int autoload); /* 2 */ - int (*itcl_FindObject) (Tcl_Interp *interp, const char *name, ItclObject **roPtr); /* 3 */ - int (*itcl_IsObject) (Tcl_Command cmd); /* 4 */ - int (*itcl_ObjectIsa) (ItclObject *contextObj, ItclClass *cdefn); /* 5 */ - int (*itcl_Protection) (Tcl_Interp *interp, int newLevel); /* 6 */ - const char * (*itcl_ProtectionStr) (int pLevel); /* 7 */ - int (*itcl_CanAccess) (ItclMemberFunc *memberPtr, Tcl_Namespace *fromNsPtr); /* 8 */ - int (*itcl_CanAccessFunc) (ItclMemberFunc *mfunc, Tcl_Namespace *fromNsPtr); /* 9 */ - void (*reserved10)(void); - void (*itcl_ParseNamespPath) (const char *name, Tcl_DString *buffer, const char **head, const char **tail); /* 11 */ - int (*itcl_DecodeScopedCommand) (Tcl_Interp *interp, const char *name, Tcl_Namespace **rNsPtr, char **rCmdPtr); /* 12 */ - int (*itcl_EvalArgs) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 13 */ - Tcl_Obj * (*itcl_CreateArgs) (Tcl_Interp *interp, const char *string, int objc, Tcl_Obj *const objv[]); /* 14 */ - void (*reserved15)(void); - void (*reserved16)(void); - int (*itcl_GetContext) (Tcl_Interp *interp, ItclClass **iclsPtrPtr, ItclObject **ioPtrPtr); /* 17 */ - void (*itcl_InitHierIter) (ItclHierIter *iter, ItclClass *iclsPtr); /* 18 */ - void (*itcl_DeleteHierIter) (ItclHierIter *iter); /* 19 */ - ItclClass * (*itcl_AdvanceHierIter) (ItclHierIter *iter); /* 20 */ - int (*itcl_FindClassesCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 21 */ - int (*itcl_FindObjectsCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 22 */ - void (*reserved23)(void); - int (*itcl_DelClassCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 24 */ - int (*itcl_DelObjectCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 25 */ - int (*itcl_ScopeCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 26 */ - int (*itcl_CodeCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 27 */ - int (*itcl_StubCreateCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 28 */ - int (*itcl_StubExistsCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 29 */ - int (*itcl_IsStub) (Tcl_Command cmd); /* 30 */ - int (*itcl_CreateClass) (Tcl_Interp *interp, const char *path, ItclObjectInfo *info, ItclClass **rPtr); /* 31 */ - int (*itcl_DeleteClass) (Tcl_Interp *interp, ItclClass *iclsPtr); /* 32 */ - Tcl_Namespace * (*itcl_FindClassNamespace) (Tcl_Interp *interp, const char *path); /* 33 */ - int (*itcl_HandleClass) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 34 */ - void (*reserved35)(void); - void (*reserved36)(void); - void (*reserved37)(void); - void (*itcl_BuildVirtualTables) (ItclClass *iclsPtr); /* 38 */ - int (*itcl_CreateVariable) (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *name, char *init, char *config, ItclVariable **ivPtr); /* 39 */ - void (*itcl_DeleteVariable) (char *cdata); /* 40 */ - const char * (*itcl_GetCommonVar) (Tcl_Interp *interp, const char *name, ItclClass *contextClass); /* 41 */ - void (*reserved42)(void); - void (*reserved43)(void); - int (*itcl_CreateObject) (Tcl_Interp *interp, const char*name, ItclClass *iclsPtr, int objc, Tcl_Obj *const objv[], ItclObject **rioPtr); /* 44 */ - int (*itcl_DeleteObject) (Tcl_Interp *interp, ItclObject *contextObj); /* 45 */ - int (*itcl_DestructObject) (Tcl_Interp *interp, ItclObject *contextObj, int flags); /* 46 */ - void (*reserved47)(void); - const char * (*itcl_GetInstanceVar) (Tcl_Interp *interp, const char *name, ItclObject *contextIoPtr, ItclClass *contextIclsPtr); /* 48 */ - void (*reserved49)(void); - int (*itcl_BodyCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 50 */ - int (*itcl_ConfigBodyCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 51 */ - int (*itcl_CreateMethod) (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *namePtr, const char *arglist, const char *body); /* 52 */ - int (*itcl_CreateProc) (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *namePtr, const char *arglist, const char *body); /* 53 */ - int (*itcl_CreateMemberFunc) (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *name, const char *arglist, const char *body, ItclMemberFunc **mfuncPtr); /* 54 */ - int (*itcl_ChangeMemberFunc) (Tcl_Interp *interp, ItclMemberFunc *mfunc, const char *arglist, const char *body); /* 55 */ - void (*itcl_DeleteMemberFunc) (char *cdata); /* 56 */ - int (*itcl_CreateMemberCode) (Tcl_Interp *interp, ItclClass *iclsPtr, const char *arglist, const char *body, ItclMemberCode **mcodePtr); /* 57 */ - void (*itcl_DeleteMemberCode) (char *cdata); /* 58 */ - int (*itcl_GetMemberCode) (Tcl_Interp *interp, ItclMemberFunc *mfunc); /* 59 */ - void (*reserved60)(void); - int (*itcl_EvalMemberCode) (Tcl_Interp *interp, ItclMemberFunc *mfunc, ItclObject *contextObj, int objc, Tcl_Obj *const objv[]); /* 61 */ - void (*reserved62)(void); - void (*reserved63)(void); - void (*reserved64)(void); - void (*reserved65)(void); - void (*reserved66)(void); - void (*itcl_GetMemberFuncUsage) (ItclMemberFunc *mfunc, ItclObject *contextObj, Tcl_Obj *objPtr); /* 67 */ - int (*itcl_ExecMethod) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 68 */ - int (*itcl_ExecProc) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 69 */ - void (*reserved70)(void); - int (*itcl_ConstructBase) (Tcl_Interp *interp, ItclObject *contextObj, ItclClass *contextClass); /* 71 */ - int (*itcl_InvokeMethodIfExists) (Tcl_Interp *interp, const char *name, ItclClass *contextClass, ItclObject *contextObj, int objc, Tcl_Obj *const objv[]); /* 72 */ - void (*reserved73)(void); - int (*itcl_ReportFuncErrors) (Tcl_Interp *interp, ItclMemberFunc *mfunc, ItclObject *contextObj, int result); /* 74 */ - int (*itcl_ParseInit) (Tcl_Interp *interp, ItclObjectInfo *info); /* 75 */ - int (*itcl_ClassCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 76 */ - int (*itcl_ClassInheritCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 77 */ - int (*itcl_ClassProtectionCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 78 */ - int (*itcl_ClassConstructorCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 79 */ - int (*itcl_ClassDestructorCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 80 */ - int (*itcl_ClassMethodCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 81 */ - int (*itcl_ClassProcCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 82 */ - int (*itcl_ClassVariableCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 83 */ - int (*itcl_ClassCommonCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 84 */ - int (*itcl_ParseVarResolver) (Tcl_Interp *interp, const char *name, Tcl_Namespace *contextNs, int flags, Tcl_Var *rPtr); /* 85 */ - int (*itcl_BiInit) (Tcl_Interp *interp, ItclObjectInfo *infoPtr); /* 86 */ - int (*itcl_InstallBiMethods) (Tcl_Interp *interp, ItclClass *cdefn); /* 87 */ - int (*itcl_BiIsaCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 88 */ - int (*itcl_BiConfigureCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 89 */ - int (*itcl_BiCgetCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 90 */ - int (*itcl_BiChainCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 91 */ - int (*itcl_BiInfoClassCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 92 */ - int (*itcl_BiInfoInheritCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 93 */ - int (*itcl_BiInfoHeritageCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 94 */ - int (*itcl_BiInfoFunctionCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 95 */ - int (*itcl_BiInfoVariableCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 96 */ - int (*itcl_BiInfoBodyCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 97 */ - int (*itcl_BiInfoArgsCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 98 */ - void (*reserved99)(void); - int (*itcl_EnsembleInit) (Tcl_Interp *interp); /* 100 */ - int (*itcl_CreateEnsemble) (Tcl_Interp *interp, const char *ensName); /* 101 */ - int (*itcl_AddEnsemblePart) (Tcl_Interp *interp, const char *ensName, const char *partName, const char *usageInfo, Tcl_ObjCmdProc *objProc, ClientData clientData, Tcl_CmdDeleteProc *deleteProc); /* 102 */ - int (*itcl_GetEnsemblePart) (Tcl_Interp *interp, const char *ensName, const char *partName, Tcl_CmdInfo *infoPtr); /* 103 */ - int (*itcl_IsEnsemble) (Tcl_CmdInfo *infoPtr); /* 104 */ - int (*itcl_GetEnsembleUsage) (Tcl_Interp *interp, const char *ensName, Tcl_Obj *objPtr); /* 105 */ - int (*itcl_GetEnsembleUsageForObj) (Tcl_Interp *interp, Tcl_Obj *ensObjPtr, Tcl_Obj *objPtr); /* 106 */ - int (*itcl_EnsembleCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 107 */ - int (*itcl_EnsPartCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 108 */ - int (*itcl_EnsembleErrorCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 109 */ - void (*reserved110)(void); - void (*reserved111)(void); - void (*reserved112)(void); - void (*reserved113)(void); - void (*reserved114)(void); - void (*itcl_Assert) (const char *testExpr, const char *fileName, int lineNum); /* 115 */ - int (*itcl_IsObjectCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 116 */ - int (*itcl_IsClassCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 117 */ - void (*reserved118)(void); - void (*reserved119)(void); - void (*reserved120)(void); - void (*reserved121)(void); - void (*reserved122)(void); - void (*reserved123)(void); - void (*reserved124)(void); - void (*reserved125)(void); - void (*reserved126)(void); - void (*reserved127)(void); - void (*reserved128)(void); - void (*reserved129)(void); - void (*reserved130)(void); - void (*reserved131)(void); - void (*reserved132)(void); - void (*reserved133)(void); - void (*reserved134)(void); - void (*reserved135)(void); - void (*reserved136)(void); - void (*reserved137)(void); - void (*reserved138)(void); - void (*reserved139)(void); - int (*itcl_FilterAddCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 140 */ - int (*itcl_FilterDeleteCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 141 */ - int (*itcl_ForwardAddCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 142 */ - int (*itcl_ForwardDeleteCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 143 */ - int (*itcl_MixinAddCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 144 */ - int (*itcl_MixinDeleteCmd) (ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 145 */ - void (*reserved146)(void); - void (*reserved147)(void); - void (*reserved148)(void); - void (*reserved149)(void); - void (*reserved150)(void); - int (*itcl_BiInfoUnknownCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 151 */ - int (*itcl_BiInfoVarsCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 152 */ - int (*itcl_CanAccess2) (ItclClass *iclsPtr, int protection, Tcl_Namespace *fromNsPtr); /* 153 */ - void (*reserved154)(void); - void (*reserved155)(void); - void (*reserved156)(void); - void (*reserved157)(void); - void (*reserved158)(void); - void (*reserved159)(void); - int (*itcl_SetCallFrameResolver) (Tcl_Interp *interp, Tcl_Resolve *resolvePtr); /* 160 */ - int (*itclEnsembleSubCmd) (ClientData clientData, Tcl_Interp *interp, const char *ensembleName, int objc, Tcl_Obj *const *objv, const char *functionName); /* 161 */ - Tcl_Namespace * (*itcl_GetUplevelNamespace) (Tcl_Interp *interp, int level); /* 162 */ - ClientData (*itcl_GetCallFrameClientData) (Tcl_Interp *interp); /* 163 */ - void (*reserved164)(void); - int (*itcl_SetCallFrameNamespace) (Tcl_Interp *interp, Tcl_Namespace *nsPtr); /* 165 */ - int (*itcl_GetCallFrameObjc) (Tcl_Interp *interp); /* 166 */ - Tcl_Obj *const * (*itcl_GetCallFrameObjv) (Tcl_Interp *interp); /* 167 */ - int (*itcl_NWidgetCmd) (ClientData infoPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 168 */ - int (*itcl_AddOptionCmd) (ClientData infoPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 169 */ - int (*itcl_AddComponentCmd) (ClientData infoPtr, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 170 */ - int (*itcl_BiInfoOptionCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 171 */ - int (*itcl_BiInfoComponentCmd) (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); /* 172 */ - int (*itcl_RenameCommand) (Tcl_Interp *interp, const char *oldName, const char *newName); /* 173 */ - int (*itcl_PushCallFrame) (Tcl_Interp *interp, Tcl_CallFrame *framePtr, Tcl_Namespace *nsPtr, int isProcCallFrame); /* 174 */ - void (*itcl_PopCallFrame) (Tcl_Interp *interp); /* 175 */ - Tcl_CallFrame * (*itcl_GetUplevelCallFrame) (Tcl_Interp *interp, int level); /* 176 */ - Tcl_CallFrame * (*itcl_ActivateCallFrame) (Tcl_Interp *interp, Tcl_CallFrame *framePtr); /* 177 */ - const char* (*itclSetInstanceVar) (Tcl_Interp *interp, const char *name, const char *name2, const char *value, ItclObject *contextIoPtr, ItclClass *contextIclsPtr); /* 178 */ - Tcl_Obj * (*itclCapitalize) (const char *str); /* 179 */ - int (*itclClassBaseCmd) (ClientData clientData, Tcl_Interp *interp, int flags, int objc, Tcl_Obj *const objv[], ItclClass **iclsPtrPtr); /* 180 */ - int (*itclCreateComponent) (Tcl_Interp *interp, ItclClass *iclsPtr, Tcl_Obj *componentPtr, int type, ItclComponent **icPtrPtr); /* 181 */ - void (*itcl_SetContext) (Tcl_Interp *interp, ItclObject *ioPtr); /* 182 */ - void (*itcl_UnsetContext) (Tcl_Interp *interp); /* 183 */ - const char * (*itclGetInstanceVar) (Tcl_Interp *interp, const char *name, const char *name2, ItclObject *ioPtr, ItclClass *iclsPtr); /* 184 */ -} ItclIntStubs; - -extern const ItclIntStubs *itclIntStubsPtr; - -#ifdef __cplusplus -} -#endif - -#if defined(USE_ITCL_STUBS) - -/* - * Inline function declarations: - */ - -#define Itcl_IsClassNamespace \ - (itclIntStubsPtr->itcl_IsClassNamespace) /* 0 */ -#define Itcl_IsClass \ - (itclIntStubsPtr->itcl_IsClass) /* 1 */ -#define Itcl_FindClass \ - (itclIntStubsPtr->itcl_FindClass) /* 2 */ -#define Itcl_FindObject \ - (itclIntStubsPtr->itcl_FindObject) /* 3 */ -#define Itcl_IsObject \ - (itclIntStubsPtr->itcl_IsObject) /* 4 */ -#define Itcl_ObjectIsa \ - (itclIntStubsPtr->itcl_ObjectIsa) /* 5 */ -#define Itcl_Protection \ - (itclIntStubsPtr->itcl_Protection) /* 6 */ -#define Itcl_ProtectionStr \ - (itclIntStubsPtr->itcl_ProtectionStr) /* 7 */ -#define Itcl_CanAccess \ - (itclIntStubsPtr->itcl_CanAccess) /* 8 */ -#define Itcl_CanAccessFunc \ - (itclIntStubsPtr->itcl_CanAccessFunc) /* 9 */ -/* Slot 10 is reserved */ -#define Itcl_ParseNamespPath \ - (itclIntStubsPtr->itcl_ParseNamespPath) /* 11 */ -#define Itcl_DecodeScopedCommand \ - (itclIntStubsPtr->itcl_DecodeScopedCommand) /* 12 */ -#define Itcl_EvalArgs \ - (itclIntStubsPtr->itcl_EvalArgs) /* 13 */ -#define Itcl_CreateArgs \ - (itclIntStubsPtr->itcl_CreateArgs) /* 14 */ -/* Slot 15 is reserved */ -/* Slot 16 is reserved */ -#define Itcl_GetContext \ - (itclIntStubsPtr->itcl_GetContext) /* 17 */ -#define Itcl_InitHierIter \ - (itclIntStubsPtr->itcl_InitHierIter) /* 18 */ -#define Itcl_DeleteHierIter \ - (itclIntStubsPtr->itcl_DeleteHierIter) /* 19 */ -#define Itcl_AdvanceHierIter \ - (itclIntStubsPtr->itcl_AdvanceHierIter) /* 20 */ -#define Itcl_FindClassesCmd \ - (itclIntStubsPtr->itcl_FindClassesCmd) /* 21 */ -#define Itcl_FindObjectsCmd \ - (itclIntStubsPtr->itcl_FindObjectsCmd) /* 22 */ -/* Slot 23 is reserved */ -#define Itcl_DelClassCmd \ - (itclIntStubsPtr->itcl_DelClassCmd) /* 24 */ -#define Itcl_DelObjectCmd \ - (itclIntStubsPtr->itcl_DelObjectCmd) /* 25 */ -#define Itcl_ScopeCmd \ - (itclIntStubsPtr->itcl_ScopeCmd) /* 26 */ -#define Itcl_CodeCmd \ - (itclIntStubsPtr->itcl_CodeCmd) /* 27 */ -#define Itcl_StubCreateCmd \ - (itclIntStubsPtr->itcl_StubCreateCmd) /* 28 */ -#define Itcl_StubExistsCmd \ - (itclIntStubsPtr->itcl_StubExistsCmd) /* 29 */ -#define Itcl_IsStub \ - (itclIntStubsPtr->itcl_IsStub) /* 30 */ -#define Itcl_CreateClass \ - (itclIntStubsPtr->itcl_CreateClass) /* 31 */ -#define Itcl_DeleteClass \ - (itclIntStubsPtr->itcl_DeleteClass) /* 32 */ -#define Itcl_FindClassNamespace \ - (itclIntStubsPtr->itcl_FindClassNamespace) /* 33 */ -#define Itcl_HandleClass \ - (itclIntStubsPtr->itcl_HandleClass) /* 34 */ -/* Slot 35 is reserved */ -/* Slot 36 is reserved */ -/* Slot 37 is reserved */ -#define Itcl_BuildVirtualTables \ - (itclIntStubsPtr->itcl_BuildVirtualTables) /* 38 */ -#define Itcl_CreateVariable \ - (itclIntStubsPtr->itcl_CreateVariable) /* 39 */ -#define Itcl_DeleteVariable \ - (itclIntStubsPtr->itcl_DeleteVariable) /* 40 */ -#define Itcl_GetCommonVar \ - (itclIntStubsPtr->itcl_GetCommonVar) /* 41 */ -/* Slot 42 is reserved */ -/* Slot 43 is reserved */ -#define Itcl_CreateObject \ - (itclIntStubsPtr->itcl_CreateObject) /* 44 */ -#define Itcl_DeleteObject \ - (itclIntStubsPtr->itcl_DeleteObject) /* 45 */ -#define Itcl_DestructObject \ - (itclIntStubsPtr->itcl_DestructObject) /* 46 */ -/* Slot 47 is reserved */ -#define Itcl_GetInstanceVar \ - (itclIntStubsPtr->itcl_GetInstanceVar) /* 48 */ -/* Slot 49 is reserved */ -#define Itcl_BodyCmd \ - (itclIntStubsPtr->itcl_BodyCmd) /* 50 */ -#define Itcl_ConfigBodyCmd \ - (itclIntStubsPtr->itcl_ConfigBodyCmd) /* 51 */ -#define Itcl_CreateMethod \ - (itclIntStubsPtr->itcl_CreateMethod) /* 52 */ -#define Itcl_CreateProc \ - (itclIntStubsPtr->itcl_CreateProc) /* 53 */ -#define Itcl_CreateMemberFunc \ - (itclIntStubsPtr->itcl_CreateMemberFunc) /* 54 */ -#define Itcl_ChangeMemberFunc \ - (itclIntStubsPtr->itcl_ChangeMemberFunc) /* 55 */ -#define Itcl_DeleteMemberFunc \ - (itclIntStubsPtr->itcl_DeleteMemberFunc) /* 56 */ -#define Itcl_CreateMemberCode \ - (itclIntStubsPtr->itcl_CreateMemberCode) /* 57 */ -#define Itcl_DeleteMemberCode \ - (itclIntStubsPtr->itcl_DeleteMemberCode) /* 58 */ -#define Itcl_GetMemberCode \ - (itclIntStubsPtr->itcl_GetMemberCode) /* 59 */ -/* Slot 60 is reserved */ -#define Itcl_EvalMemberCode \ - (itclIntStubsPtr->itcl_EvalMemberCode) /* 61 */ -/* Slot 62 is reserved */ -/* Slot 63 is reserved */ -/* Slot 64 is reserved */ -/* Slot 65 is reserved */ -/* Slot 66 is reserved */ -#define Itcl_GetMemberFuncUsage \ - (itclIntStubsPtr->itcl_GetMemberFuncUsage) /* 67 */ -#define Itcl_ExecMethod \ - (itclIntStubsPtr->itcl_ExecMethod) /* 68 */ -#define Itcl_ExecProc \ - (itclIntStubsPtr->itcl_ExecProc) /* 69 */ -/* Slot 70 is reserved */ -#define Itcl_ConstructBase \ - (itclIntStubsPtr->itcl_ConstructBase) /* 71 */ -#define Itcl_InvokeMethodIfExists \ - (itclIntStubsPtr->itcl_InvokeMethodIfExists) /* 72 */ -/* Slot 73 is reserved */ -#define Itcl_ReportFuncErrors \ - (itclIntStubsPtr->itcl_ReportFuncErrors) /* 74 */ -#define Itcl_ParseInit \ - (itclIntStubsPtr->itcl_ParseInit) /* 75 */ -#define Itcl_ClassCmd \ - (itclIntStubsPtr->itcl_ClassCmd) /* 76 */ -#define Itcl_ClassInheritCmd \ - (itclIntStubsPtr->itcl_ClassInheritCmd) /* 77 */ -#define Itcl_ClassProtectionCmd \ - (itclIntStubsPtr->itcl_ClassProtectionCmd) /* 78 */ -#define Itcl_ClassConstructorCmd \ - (itclIntStubsPtr->itcl_ClassConstructorCmd) /* 79 */ -#define Itcl_ClassDestructorCmd \ - (itclIntStubsPtr->itcl_ClassDestructorCmd) /* 80 */ -#define Itcl_ClassMethodCmd \ - (itclIntStubsPtr->itcl_ClassMethodCmd) /* 81 */ -#define Itcl_ClassProcCmd \ - (itclIntStubsPtr->itcl_ClassProcCmd) /* 82 */ -#define Itcl_ClassVariableCmd \ - (itclIntStubsPtr->itcl_ClassVariableCmd) /* 83 */ -#define Itcl_ClassCommonCmd \ - (itclIntStubsPtr->itcl_ClassCommonCmd) /* 84 */ -#define Itcl_ParseVarResolver \ - (itclIntStubsPtr->itcl_ParseVarResolver) /* 85 */ -#define Itcl_BiInit \ - (itclIntStubsPtr->itcl_BiInit) /* 86 */ -#define Itcl_InstallBiMethods \ - (itclIntStubsPtr->itcl_InstallBiMethods) /* 87 */ -#define Itcl_BiIsaCmd \ - (itclIntStubsPtr->itcl_BiIsaCmd) /* 88 */ -#define Itcl_BiConfigureCmd \ - (itclIntStubsPtr->itcl_BiConfigureCmd) /* 89 */ -#define Itcl_BiCgetCmd \ - (itclIntStubsPtr->itcl_BiCgetCmd) /* 90 */ -#define Itcl_BiChainCmd \ - (itclIntStubsPtr->itcl_BiChainCmd) /* 91 */ -#define Itcl_BiInfoClassCmd \ - (itclIntStubsPtr->itcl_BiInfoClassCmd) /* 92 */ -#define Itcl_BiInfoInheritCmd \ - (itclIntStubsPtr->itcl_BiInfoInheritCmd) /* 93 */ -#define Itcl_BiInfoHeritageCmd \ - (itclIntStubsPtr->itcl_BiInfoHeritageCmd) /* 94 */ -#define Itcl_BiInfoFunctionCmd \ - (itclIntStubsPtr->itcl_BiInfoFunctionCmd) /* 95 */ -#define Itcl_BiInfoVariableCmd \ - (itclIntStubsPtr->itcl_BiInfoVariableCmd) /* 96 */ -#define Itcl_BiInfoBodyCmd \ - (itclIntStubsPtr->itcl_BiInfoBodyCmd) /* 97 */ -#define Itcl_BiInfoArgsCmd \ - (itclIntStubsPtr->itcl_BiInfoArgsCmd) /* 98 */ -/* Slot 99 is reserved */ -#define Itcl_EnsembleInit \ - (itclIntStubsPtr->itcl_EnsembleInit) /* 100 */ -#define Itcl_CreateEnsemble \ - (itclIntStubsPtr->itcl_CreateEnsemble) /* 101 */ -#define Itcl_AddEnsemblePart \ - (itclIntStubsPtr->itcl_AddEnsemblePart) /* 102 */ -#define Itcl_GetEnsemblePart \ - (itclIntStubsPtr->itcl_GetEnsemblePart) /* 103 */ -#define Itcl_IsEnsemble \ - (itclIntStubsPtr->itcl_IsEnsemble) /* 104 */ -#define Itcl_GetEnsembleUsage \ - (itclIntStubsPtr->itcl_GetEnsembleUsage) /* 105 */ -#define Itcl_GetEnsembleUsageForObj \ - (itclIntStubsPtr->itcl_GetEnsembleUsageForObj) /* 106 */ -#define Itcl_EnsembleCmd \ - (itclIntStubsPtr->itcl_EnsembleCmd) /* 107 */ -#define Itcl_EnsPartCmd \ - (itclIntStubsPtr->itcl_EnsPartCmd) /* 108 */ -#define Itcl_EnsembleErrorCmd \ - (itclIntStubsPtr->itcl_EnsembleErrorCmd) /* 109 */ -/* Slot 110 is reserved */ -/* Slot 111 is reserved */ -/* Slot 112 is reserved */ -/* Slot 113 is reserved */ -/* Slot 114 is reserved */ -#define Itcl_Assert \ - (itclIntStubsPtr->itcl_Assert) /* 115 */ -#define Itcl_IsObjectCmd \ - (itclIntStubsPtr->itcl_IsObjectCmd) /* 116 */ -#define Itcl_IsClassCmd \ - (itclIntStubsPtr->itcl_IsClassCmd) /* 117 */ -/* Slot 118 is reserved */ -/* Slot 119 is reserved */ -/* Slot 120 is reserved */ -/* Slot 121 is reserved */ -/* Slot 122 is reserved */ -/* Slot 123 is reserved */ -/* Slot 124 is reserved */ -/* Slot 125 is reserved */ -/* Slot 126 is reserved */ -/* Slot 127 is reserved */ -/* Slot 128 is reserved */ -/* Slot 129 is reserved */ -/* Slot 130 is reserved */ -/* Slot 131 is reserved */ -/* Slot 132 is reserved */ -/* Slot 133 is reserved */ -/* Slot 134 is reserved */ -/* Slot 135 is reserved */ -/* Slot 136 is reserved */ -/* Slot 137 is reserved */ -/* Slot 138 is reserved */ -/* Slot 139 is reserved */ -#define Itcl_FilterAddCmd \ - (itclIntStubsPtr->itcl_FilterAddCmd) /* 140 */ -#define Itcl_FilterDeleteCmd \ - (itclIntStubsPtr->itcl_FilterDeleteCmd) /* 141 */ -#define Itcl_ForwardAddCmd \ - (itclIntStubsPtr->itcl_ForwardAddCmd) /* 142 */ -#define Itcl_ForwardDeleteCmd \ - (itclIntStubsPtr->itcl_ForwardDeleteCmd) /* 143 */ -#define Itcl_MixinAddCmd \ - (itclIntStubsPtr->itcl_MixinAddCmd) /* 144 */ -#define Itcl_MixinDeleteCmd \ - (itclIntStubsPtr->itcl_MixinDeleteCmd) /* 145 */ -/* Slot 146 is reserved */ -/* Slot 147 is reserved */ -/* Slot 148 is reserved */ -/* Slot 149 is reserved */ -/* Slot 150 is reserved */ -#define Itcl_BiInfoUnknownCmd \ - (itclIntStubsPtr->itcl_BiInfoUnknownCmd) /* 151 */ -#define Itcl_BiInfoVarsCmd \ - (itclIntStubsPtr->itcl_BiInfoVarsCmd) /* 152 */ -#define Itcl_CanAccess2 \ - (itclIntStubsPtr->itcl_CanAccess2) /* 153 */ -/* Slot 154 is reserved */ -/* Slot 155 is reserved */ -/* Slot 156 is reserved */ -/* Slot 157 is reserved */ -/* Slot 158 is reserved */ -/* Slot 159 is reserved */ -#define Itcl_SetCallFrameResolver \ - (itclIntStubsPtr->itcl_SetCallFrameResolver) /* 160 */ -#define ItclEnsembleSubCmd \ - (itclIntStubsPtr->itclEnsembleSubCmd) /* 161 */ -#define Itcl_GetUplevelNamespace \ - (itclIntStubsPtr->itcl_GetUplevelNamespace) /* 162 */ -#define Itcl_GetCallFrameClientData \ - (itclIntStubsPtr->itcl_GetCallFrameClientData) /* 163 */ -/* Slot 164 is reserved */ -#define Itcl_SetCallFrameNamespace \ - (itclIntStubsPtr->itcl_SetCallFrameNamespace) /* 165 */ -#define Itcl_GetCallFrameObjc \ - (itclIntStubsPtr->itcl_GetCallFrameObjc) /* 166 */ -#define Itcl_GetCallFrameObjv \ - (itclIntStubsPtr->itcl_GetCallFrameObjv) /* 167 */ -#define Itcl_NWidgetCmd \ - (itclIntStubsPtr->itcl_NWidgetCmd) /* 168 */ -#define Itcl_AddOptionCmd \ - (itclIntStubsPtr->itcl_AddOptionCmd) /* 169 */ -#define Itcl_AddComponentCmd \ - (itclIntStubsPtr->itcl_AddComponentCmd) /* 170 */ -#define Itcl_BiInfoOptionCmd \ - (itclIntStubsPtr->itcl_BiInfoOptionCmd) /* 171 */ -#define Itcl_BiInfoComponentCmd \ - (itclIntStubsPtr->itcl_BiInfoComponentCmd) /* 172 */ -#define Itcl_RenameCommand \ - (itclIntStubsPtr->itcl_RenameCommand) /* 173 */ -#define Itcl_PushCallFrame \ - (itclIntStubsPtr->itcl_PushCallFrame) /* 174 */ -#define Itcl_PopCallFrame \ - (itclIntStubsPtr->itcl_PopCallFrame) /* 175 */ -#define Itcl_GetUplevelCallFrame \ - (itclIntStubsPtr->itcl_GetUplevelCallFrame) /* 176 */ -#define Itcl_ActivateCallFrame \ - (itclIntStubsPtr->itcl_ActivateCallFrame) /* 177 */ -#define ItclSetInstanceVar \ - (itclIntStubsPtr->itclSetInstanceVar) /* 178 */ -#define ItclCapitalize \ - (itclIntStubsPtr->itclCapitalize) /* 179 */ -#define ItclClassBaseCmd \ - (itclIntStubsPtr->itclClassBaseCmd) /* 180 */ -#define ItclCreateComponent \ - (itclIntStubsPtr->itclCreateComponent) /* 181 */ -#define Itcl_SetContext \ - (itclIntStubsPtr->itcl_SetContext) /* 182 */ -#define Itcl_UnsetContext \ - (itclIntStubsPtr->itcl_UnsetContext) /* 183 */ -#define ItclGetInstanceVar \ - (itclIntStubsPtr->itclGetInstanceVar) /* 184 */ - -#endif /* defined(USE_ITCL_STUBS) */ - -/* !END!: Do not edit above this line. */ - -#endif /* _ITCLINTDECLS */ diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclLinkage.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclLinkage.c deleted file mode 100644 index b0e87d8..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclLinkage.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This part adds a mechanism for integrating C procedures into - * [incr Tcl] classes as methods and procs. Each C procedure must - * either be declared via Itcl_RegisterC() or dynamically loaded. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -/* - * These records store the pointers for all "RegisterC" functions. - */ -typedef struct ItclCfunc { - Tcl_CmdProc *argCmdProc; /* old-style (argc,argv) command handler */ - Tcl_ObjCmdProc *objCmdProc; /* new (objc,objv) command handler */ - ClientData clientData; /* client data passed into this function */ - Tcl_CmdDeleteProc *deleteProc; /* proc called to free clientData */ -} ItclCfunc; - -static Tcl_HashTable* ItclGetRegisteredProcs(Tcl_Interp *interp); -static void ItclFreeC(ClientData clientData, Tcl_Interp *interp); - - -/* - * ------------------------------------------------------------------------ - * Itcl_RegisterC() - * - * Used to associate a symbolic name with an (argc,argv) C procedure - * that handles a Tcl command. Procedures that are registered in this - * manner can be referenced in the body of an [incr Tcl] class - * definition to specify C procedures to acting as methods/procs. - * Usually invoked in an initialization routine for an extension, - * called out in Tcl_AppInit() at the start of an application. - * - * Each symbolic procedure can have an arbitrary client data value - * associated with it. This value is passed into the command - * handler whenever it is invoked. - * - * A symbolic procedure name can be used only once for a given style - * (arg/obj) handler. If the name is defined with an arg-style - * handler, it can be redefined with an obj-style handler; or if - * the name is defined with an obj-style handler, it can be redefined - * with an arg-style handler. In either case, any previous client - * data is discarded and the new client data is remembered. However, - * if a name is redefined to a different handler of the same style, - * this procedure returns an error. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error message - * in interp->result) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_RegisterC(interp, name, proc, clientData, deleteProc) - Tcl_Interp *interp; /* interpreter handling this registration */ - const char *name; /* symbolic name for procedure */ - Tcl_CmdProc *proc; /* procedure handling Tcl command */ - ClientData clientData; /* client data associated with proc */ - Tcl_CmdDeleteProc *deleteProc; /* proc called to free up client data */ -{ - int newEntry; - Tcl_HashEntry *entry; - Tcl_HashTable *procTable; - ItclCfunc *cfunc; - - /* - * Make sure that a proc was specified. - */ - if (!proc) { - Tcl_AppendResult(interp, "initialization error: null pointer for ", - "C procedure \"", name, "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Add a new entry for the given procedure. If an entry with - * this name already exists, then make sure that it was defined - * with the same proc. - */ - procTable = ItclGetRegisteredProcs(interp); - entry = Tcl_CreateHashEntry(procTable, name, &newEntry); - if (!newEntry) { - cfunc = (ItclCfunc*)Tcl_GetHashValue(entry); - if (cfunc->argCmdProc != NULL && cfunc->argCmdProc != proc) { - Tcl_AppendResult(interp, "initialization error: C procedure ", - "with name \"", name, "\" already defined", - (char*)NULL); - return TCL_ERROR; - } - - if (cfunc->deleteProc != NULL) { - (*cfunc->deleteProc)(cfunc->clientData); - } - } else { - cfunc = (ItclCfunc*)ckalloc(sizeof(ItclCfunc)); - cfunc->objCmdProc = NULL; - } - - cfunc->argCmdProc = proc; - cfunc->clientData = clientData; - cfunc->deleteProc = deleteProc; - - Tcl_SetHashValue(entry, (ClientData)cfunc); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_RegisterObjC() - * - * Used to associate a symbolic name with an (objc,objv) C procedure - * that handles a Tcl command. Procedures that are registered in this - * manner can be referenced in the body of an [incr Tcl] class - * definition to specify C procedures to acting as methods/procs. - * Usually invoked in an initialization routine for an extension, - * called out in Tcl_AppInit() at the start of an application. - * - * Each symbolic procedure can have an arbitrary client data value - * associated with it. This value is passed into the command - * handler whenever it is invoked. - * - * A symbolic procedure name can be used only once for a given style - * (arg/obj) handler. If the name is defined with an arg-style - * handler, it can be redefined with an obj-style handler; or if - * the name is defined with an obj-style handler, it can be redefined - * with an arg-style handler. In either case, any previous client - * data is discarded and the new client data is remembered. However, - * if a name is redefined to a different handler of the same style, - * this procedure returns an error. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error message - * in interp->result) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_RegisterObjC(interp, name, proc, clientData, deleteProc) - Tcl_Interp *interp; /* interpreter handling this registration */ - const char *name; /* symbolic name for procedure */ - Tcl_ObjCmdProc *proc; /* procedure handling Tcl command */ - ClientData clientData; /* client data associated with proc */ - Tcl_CmdDeleteProc *deleteProc; /* proc called to free up client data */ -{ - int newEntry; - Tcl_HashEntry *entry; - Tcl_HashTable *procTable; - ItclCfunc *cfunc; - - /* - * Make sure that a proc was specified. - */ - if (!proc) { - Tcl_AppendResult(interp, "initialization error: null pointer for ", - "C procedure \"", name, "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Add a new entry for the given procedure. If an entry with - * this name already exists, then make sure that it was defined - * with the same proc. - */ - procTable = ItclGetRegisteredProcs(interp); - entry = Tcl_CreateHashEntry(procTable, name, &newEntry); - if (!newEntry) { - cfunc = (ItclCfunc*)Tcl_GetHashValue(entry); - if (cfunc->objCmdProc != NULL && cfunc->objCmdProc != proc) { - Tcl_AppendResult(interp, "initialization error: C procedure ", - "with name \"", name, "\" already defined", - (char*)NULL); - return TCL_ERROR; - } - - if (cfunc->deleteProc != NULL) { - (*cfunc->deleteProc)(cfunc->clientData); - } - } - else { - cfunc = (ItclCfunc*)ckalloc(sizeof(ItclCfunc)); - cfunc->argCmdProc = NULL; - } - - cfunc->objCmdProc = proc; - cfunc->clientData = clientData; - cfunc->deleteProc = deleteProc; - - Tcl_SetHashValue(entry, (ClientData)cfunc); - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_FindC() - * - * Used to query a C procedure via its symbolic name. Looks at the - * list of procedures registered previously by either Itcl_RegisterC - * or Itcl_RegisterObjC and returns pointers to the appropriate - * (argc,argv) or (objc,objv) handlers. Returns non-zero if the - * name is recognized and pointers are returned; returns zero - * otherwise. - * ------------------------------------------------------------------------ - */ -int -Itcl_FindC( - Tcl_Interp *interp, /* interpreter handling this registration */ - const char *name, /* symbolic name for procedure */ - Tcl_CmdProc **argProcPtr, /* returns (argc,argv) command handler */ - Tcl_ObjCmdProc **objProcPtr, /* returns (objc,objv) command handler */ - ClientData *cDataPtr) /* returns client data */ -{ - Tcl_HashEntry *entry; - Tcl_HashTable *procTable; - ItclCfunc *cfunc; - - *argProcPtr = NULL; /* assume info won't be found */ - *objProcPtr = NULL; - *cDataPtr = NULL; - - if (interp) { - procTable = (Tcl_HashTable*)Tcl_GetAssocData(interp, - "itcl_RegC", (Tcl_InterpDeleteProc**)NULL); - - if (procTable) { - entry = Tcl_FindHashEntry(procTable, name); - if (entry) { - cfunc = (ItclCfunc*)Tcl_GetHashValue(entry); - *argProcPtr = cfunc->argCmdProc; - *objProcPtr = cfunc->objCmdProc; - *cDataPtr = cfunc->clientData; - } - } - } - return (*argProcPtr != NULL || *objProcPtr != NULL); -} - - -/* - * ------------------------------------------------------------------------ - * ItclGetRegisteredProcs() - * - * Returns a pointer to a hash table containing the list of registered - * procs in the specified interpreter. If the hash table does not - * already exist, it is created. - * ------------------------------------------------------------------------ - */ -static Tcl_HashTable* -ItclGetRegisteredProcs(interp) - Tcl_Interp *interp; /* interpreter handling this registration */ -{ - Tcl_HashTable* procTable; - - /* - * If the registration table does not yet exist, then create it. - */ - procTable = (Tcl_HashTable*)Tcl_GetAssocData(interp, "itcl_RegC", - (Tcl_InterpDeleteProc**)NULL); - - if (!procTable) { - procTable = (Tcl_HashTable*)ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitHashTable(procTable, TCL_STRING_KEYS); - Tcl_SetAssocData(interp, "itcl_RegC", ItclFreeC, - (ClientData)procTable); - } - return procTable; -} - - -/* - * ------------------------------------------------------------------------ - * ItclFreeC() - * - * When an interpreter is deleted, this procedure is called to - * free up the associated data created by Itcl_RegisterC and - * Itcl_RegisterObjC. - * ------------------------------------------------------------------------ - */ -static void -ItclFreeC(clientData, interp) - ClientData clientData; /* associated data */ - Tcl_Interp *interp; /* intepreter being deleted */ -{ - Tcl_HashTable *tablePtr = (Tcl_HashTable*)clientData; - Tcl_HashSearch place; - Tcl_HashEntry *entry; - ItclCfunc *cfunc; - - entry = Tcl_FirstHashEntry(tablePtr, &place); - while (entry) { - cfunc = (ItclCfunc*)Tcl_GetHashValue(entry); - - if (cfunc->deleteProc != NULL) { - (*cfunc->deleteProc)(cfunc->clientData); - } - ckfree ( (char*)cfunc ); - entry = Tcl_NextHashEntry(&place); - } - - Tcl_DeleteHashTable(tablePtr); - ckfree((char*)tablePtr); -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclMethod.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclMethod.c deleted file mode 100644 index e33e62b..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclMethod.c +++ /dev/null @@ -1,2721 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * These procedures handle commands available within a class scope. - * In [incr Tcl], the term "method" is used for a procedure that has - * access to object-specific data, while the term "proc" is used for - * a procedure that has access only to common class data. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -static int EquivArgLists(Tcl_Interp *interp, ItclArgList *origArgs, - ItclArgList *realArgs); -static int ItclCreateMemberCode(Tcl_Interp* interp, ItclClass *iclsPtr, - const char* arglist, const char* body, ItclMemberCode** mcodePtr, - Tcl_Obj *namePtr, int flags); -static int ItclCreateMemberFunc(Tcl_Interp* interp, ItclClass *iclsPtr, - Tcl_Obj *namePtr, const char* arglist, const char* body, - ItclMemberFunc** imPtrPtr, int flags); - -void -ItclPreserveIMF( - ItclMemberFunc *imPtr) -{ - imPtr->refCount++; -} - -void -ItclReleaseIMF( - ClientData clientData) -{ - ItclMemberFunc *imPtr = (ItclMemberFunc *)clientData; - - if (--imPtr->refCount == 0) { - Itcl_DeleteMemberFunc(clientData); - } -} - -/* - * ------------------------------------------------------------------------ - * Itcl_BodyCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::body" command to - * define or redefine the implementation for a class method/proc. - * Handles the following syntax: - * - * itcl::body <class>::<func> <arglist> <body> - * - * Looks for an existing class member function with the name <func>, - * and if found, tries to assign the implementation. If an argument - * list was specified in the original declaration, it must match - * <arglist> or an error is flagged. If <body> has the form "@name" - * then it is treated as a reference to a C handling procedure; - * otherwise, it is taken as a body of Tcl statements. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -static int -NRBodyCmd( - ClientData clientData, /* */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const *objv) /* argument objects */ -{ - Tcl_HashEntry *entry; - Tcl_DString buffer; - Tcl_Obj *objPtr; - ItclClass *iclsPtr; - ItclMemberFunc *imPtr; - const char *head; - const char *tail; - const char *token; - char *arglist; - char *body; - int status = TCL_OK; - - ItclShowArgs(2, "Itcl_BodyCmd", objc, objv); - if (objc != 4) { - token = Tcl_GetString(objv[0]); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "wrong # args: should be \"", - token, " class::func arglist body\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Parse the member name "namesp::namesp::class::func". - * Make sure that a class name was specified, and that the - * class exists. - */ - token = Tcl_GetString(objv[1]); - Itcl_ParseNamespPath(token, &buffer, &head, &tail); - - if (!head || *head == '\0') { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "missing class specifier for body declaration \"", token, "\"", - (char*)NULL); - status = TCL_ERROR; - goto bodyCmdDone; - } - - iclsPtr = Itcl_FindClass(interp, head, /* autoload */ 1); - if (iclsPtr == NULL) { - status = TCL_ERROR; - goto bodyCmdDone; - } - - /* - * Find the function and try to change its implementation. - * Note that command resolution table contains *all* functions, - * even those in a base class. Make sure that the class - * containing the method definition is the requested class. - */ - - imPtr = NULL; - objPtr = Tcl_NewStringObj(tail, -1); - entry = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (entry) { - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - imPtr = clookup->imPtr; - if (imPtr->iclsPtr != iclsPtr) { - imPtr = NULL; - } - } - - if (imPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "function \"", tail, "\" is not defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - status = TCL_ERROR; - goto bodyCmdDone; - } - - arglist = Tcl_GetString(objv[2]); - body = Tcl_GetString(objv[3]); - - if (Itcl_ChangeMemberFunc(interp, imPtr, arglist, body) != TCL_OK) { - status = TCL_ERROR; - goto bodyCmdDone; - } - -bodyCmdDone: - Tcl_DStringFree(&buffer); - return status; -} - -/* ARGSUSED */ -int -Itcl_BodyCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRBodyCmd, clientData, objc, objv); -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_ConfigBodyCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::configbody" command - * to define or redefine the configuration code associated with a - * public variable. Handles the following syntax: - * - * itcl::configbody <class>::<publicVar> <body> - * - * Looks for an existing public variable with the name <publicVar>, - * and if found, tries to assign the implementation. If <body> has - * the form "@name" then it is treated as a reference to a C handling - * procedure; otherwise, it is taken as a body of Tcl statements. - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -NRConfigBodyCmd( - ClientData dummy, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int status = TCL_OK; - - const char *head; - const char *tail; - const char *token; - Tcl_DString buffer; - ItclClass *iclsPtr; - ItclVarLookup *vlookup; - ItclVariable *ivPtr; - ItclMemberCode *mcode; - Tcl_HashEntry *entry; - - ItclShowArgs(2, "Itcl_ConfigBodyCmd", objc, objv); - if (objc != 3) { - Tcl_WrongNumArgs(interp, 1, objv, "class::option body"); - return TCL_ERROR; - } - - /* - * Parse the member name "namesp::namesp::class::option". - * Make sure that a class name was specified, and that the - * class exists. - */ - token = Tcl_GetString(objv[1]); - Itcl_ParseNamespPath(token, &buffer, &head, &tail); - - if ((head == NULL) || (*head == '\0')) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "missing class specifier for body declaration \"", token, "\"", - (char*)NULL); - status = TCL_ERROR; - goto configBodyCmdDone; - } - - iclsPtr = Itcl_FindClass(interp, head, /* autoload */ 1); - if (iclsPtr == NULL) { - status = TCL_ERROR; - goto configBodyCmdDone; - } - - /* - * Find the variable and change its implementation. - * Note that variable resolution table has *all* variables, - * even those in a base class. Make sure that the class - * containing the variable definition is the requested class. - */ - vlookup = NULL; - entry = Tcl_FindHashEntry(&iclsPtr->resolveVars, tail); - if (entry) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(entry); - if (vlookup->ivPtr->iclsPtr != iclsPtr) { - vlookup = NULL; - } - } - - if (vlookup == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "option \"", tail, "\" is not defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - status = TCL_ERROR; - goto configBodyCmdDone; - } - ivPtr = vlookup->ivPtr; - - if (ivPtr->protection != ITCL_PUBLIC) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "option \"", Tcl_GetString(ivPtr->fullNamePtr), - "\" is not a public configuration option", - (char*)NULL); - status = TCL_ERROR; - goto configBodyCmdDone; - } - - token = Tcl_GetString(objv[2]); - - if (Itcl_CreateMemberCode(interp, iclsPtr, (char*)NULL, token, - &mcode) != TCL_OK) { - status = TCL_ERROR; - goto configBodyCmdDone; - } - - Itcl_PreserveData((ClientData)mcode); - Itcl_EventuallyFree((ClientData)mcode, Itcl_DeleteMemberCode); - - if (ivPtr->codePtr) { - Itcl_ReleaseData((ClientData)ivPtr->codePtr); - } - ivPtr->codePtr = mcode; - -configBodyCmdDone: - Tcl_DStringFree(&buffer); - return status; -} - -/* ARGSUSED */ -int -Itcl_ConfigBodyCmd( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRConfigBodyCmd, clientData, objc, objv); -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateMethod() - * - * Installs a method into the namespace associated with a class. - * If another command with the same name is already installed, then - * it is overwritten. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error message - * in the specified interp) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateMethod( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class definition */ - Tcl_Obj *namePtr, /* name of new method */ - const char* arglist, /* space-separated list of arg names */ - const char* body) /* body of commands for the method */ -{ - ItclMemberFunc *imPtr; - - return ItclCreateMethod(interp, iclsPtr, namePtr, arglist, body, &imPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclCreateMethod() - * - * Installs a method into the namespace associated with a class. - * If another command with the same name is already installed, then - * it is overwritten. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error message - * in the specified interp) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -ItclCreateMethod( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class definition */ - Tcl_Obj *namePtr, /* name of new method */ - const char* arglist, /* space-separated list of arg names */ - const char* body, /* body of commands for the method */ - ItclMemberFunc **imPtrPtr) -{ - ItclMemberFunc *imPtr; - - /* - * Make sure that the method name does not contain anything - * goofy like a "::" scope qualifier. - */ - if (strstr(Tcl_GetString(namePtr),"::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad method name \"", Tcl_GetString(namePtr), "\"", - (char*)NULL); - Tcl_DecrRefCount(namePtr); - return TCL_ERROR; - } - - /* - * Create the method definition. - */ - if (ItclCreateMemberFunc(interp, iclsPtr, namePtr, arglist, body, - &imPtr, 0) != TCL_OK) { - return TCL_ERROR; - } - - imPtr->flags |= ITCL_METHOD; - if (imPtrPtr != NULL) { - *imPtrPtr = imPtr; - } - ItclAddClassFunctionDictInfo(interp, iclsPtr, imPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateProc() - * - * Installs a class proc into the namespace associated with a class. - * If another command with the same name is already installed, then - * it is overwritten. Returns TCL_OK on success, or TCL_ERROR (along - * with an error message in the specified interp) if anything goes - * wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateProc( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class definition */ - Tcl_Obj* namePtr, /* name of new proc */ - const char *arglist, /* space-separated list of arg names */ - const char *body) /* body of commands for the proc */ -{ - ItclMemberFunc *imPtr; - - /* - * Make sure that the proc name does not contain anything - * goofy like a "::" scope qualifier. - */ - if (strstr(Tcl_GetString(namePtr),"::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad proc name \"", Tcl_GetString(namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Create the proc definition. - */ - if (ItclCreateMemberFunc(interp, iclsPtr, namePtr, arglist, - body, &imPtr, ITCL_COMMON) != TCL_OK) { - return TCL_ERROR; - } - - /* - * Mark procs as "common". This distinguishes them from methods. - */ - imPtr->flags |= ITCL_COMMON; - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * ItclCreateMemberFunc() - * - * Creates the data record representing a member function. This - * includes the argument list and the body of the function. If the - * body is of the form "@name", then it is treated as a label for - * a C procedure registered by Itcl_RegisterC(). - * - * If any errors are encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK, and "imPtr" returns a pointer to the new - * member function. - * ------------------------------------------------------------------------ - */ -static int -ItclCreateMemberFunc( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class definition */ - Tcl_Obj *namePtr, /* name of new member */ - const char* arglist, /* space-separated list of arg names */ - const char* body, /* body of commands for the method */ - ItclMemberFunc** imPtrPtr, /* returns: pointer to new method defn */ - int flags) -{ - int newEntry; - char *name; - ItclMemberFunc *imPtr; - ItclMemberCode *mcode; - Tcl_HashEntry *hPtr; - - /* - * Add the member function to the list of functions for - * the class. Make sure that a member function with the - * same name doesn't already exist. - */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->functions, (char *)namePtr, &newEntry); - if (!newEntry) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", Tcl_GetString(namePtr), "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Try to create the implementation for this command member. - */ - if (ItclCreateMemberCode(interp, iclsPtr, arglist, body, - &mcode, namePtr, flags) != TCL_OK) { - - Tcl_DeleteHashEntry(hPtr); - return TCL_ERROR; - } - - Itcl_PreserveData((ClientData)mcode); - Itcl_EventuallyFree((ClientData)mcode, Itcl_DeleteMemberCode); - - /* - * Allocate a member function definition and return. - */ - imPtr = (ItclMemberFunc*)ckalloc(sizeof(ItclMemberFunc)); - memset(imPtr, 0, sizeof(ItclMemberFunc)); - imPtr->iclsPtr = iclsPtr; - imPtr->infoPtr = iclsPtr->infoPtr; - imPtr->protection = Itcl_Protection(interp, 0); - imPtr->namePtr = Tcl_NewStringObj(Tcl_GetString(namePtr), -1); - Tcl_IncrRefCount(imPtr->namePtr); - imPtr->fullNamePtr = Tcl_NewStringObj( - Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_AppendToObj(imPtr->fullNamePtr, "::", 2); - Tcl_AppendToObj(imPtr->fullNamePtr, Tcl_GetString(namePtr), -1); - Tcl_IncrRefCount(imPtr->fullNamePtr); - if (arglist != NULL) { - imPtr->origArgsPtr = Tcl_NewStringObj(arglist, -1); - Tcl_IncrRefCount(imPtr->origArgsPtr); - } - imPtr->codePtr = mcode; - - if (imPtr->protection == ITCL_DEFAULT_PROTECT) { - imPtr->protection = ITCL_PUBLIC; - } - - imPtr->declaringClassPtr = iclsPtr; - - if (arglist) { - imPtr->flags |= ITCL_ARG_SPEC; - } - if (mcode->argListPtr) { - ItclCreateArgList(interp, arglist, &imPtr->argcount, - &imPtr->maxargcount, &imPtr->usagePtr, - &imPtr->argListPtr, imPtr, NULL); - Tcl_IncrRefCount(imPtr->usagePtr); - } - - name = Tcl_GetString(namePtr); - if ((body != NULL) && (body[0] == '@')) { - /* check for builtin cget isa and configure and mark them for - * use of a different arglist "args" for TclOO !! */ - imPtr->codePtr->flags |= ITCL_BUILTIN; - if (strcmp(name, "cget") == 0) { - } - if (strcmp(name, "configure") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "isa") == 0) { - } - if (strcmp(name, "createhull") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "keepcomponentoption") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "ignorecomponentoption") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "renamecomponentoption") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "addoptioncomponent") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "ignoreoptioncomponent") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "renameoptioncomponent") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "setupcomponent") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "itcl_initoptions") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "mytypemethod") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - imPtr->flags |= ITCL_COMMON; - } - if (strcmp(name, "mymethod") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "mytypevar") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - imPtr->flags |= ITCL_COMMON; - } - if (strcmp(name, "myvar") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "itcl_hull") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - imPtr->flags |= ITCL_COMPONENT; - } - if (strcmp(name, "callinstance") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "getinstancevar") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "myproc") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - imPtr->flags |= ITCL_COMMON; - } - if (strcmp(name, "installhull") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "destroy") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "installcomponent") == 0) { - imPtr->argcount = 0; - imPtr->maxargcount = -1; - } - if (strcmp(name, "info") == 0) { - imPtr->flags |= ITCL_COMMON; - } - } - if (strcmp(name, "constructor") == 0) { - /* - * REVISE mcode->bodyPtr here! - * Include a [my ItclConstructBase $iclsPtr] method call. - * Inherited from itcl::Root - */ - - Tcl_Obj *newBody = Tcl_NewStringObj("", -1); - Tcl_AppendToObj(newBody, - "[::info object namespace ${this}]::my ItclConstructBase ", -1); - Tcl_AppendObjToObj(newBody, iclsPtr->fullNamePtr); - Tcl_AppendToObj(newBody, "\n", -1); - - Tcl_AppendObjToObj(newBody, mcode->bodyPtr); - Tcl_DecrRefCount(mcode->bodyPtr); - mcode->bodyPtr = newBody; - Tcl_IncrRefCount(mcode->bodyPtr); - imPtr->flags |= ITCL_CONSTRUCTOR; - } - if (strcmp(name, "destructor") == 0) { - imPtr->flags |= ITCL_DESTRUCTOR; - } - - Tcl_SetHashValue(hPtr, (ClientData)imPtr); - imPtr->refCount = 1; - - *imPtrPtr = imPtr; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateMemberFunc() - * - * Creates the data record representing a member function. This - * includes the argument list and the body of the function. If the - * body is of the form "@name", then it is treated as a label for - * a C procedure registered by Itcl_RegisterC(). - * - * If any errors are encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK, and "imPtr" returns a pointer to the new - * member function. - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateMemberFunc( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class definition */ - Tcl_Obj *namePtr, /* name of new member */ - const char* arglist, /* space-separated list of arg names */ - const char* body, /* body of commands for the method */ - ItclMemberFunc** imPtrPtr) /* returns: pointer to new method defn */ -{ - return ItclCreateMemberFunc(interp, iclsPtr, namePtr, arglist, - body, imPtrPtr, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ChangeMemberFunc() - * - * Modifies the data record representing a member function. This - * is usually the body of the function, but can include the argument - * list if it was not defined when the member was first created. - * If the body is of the form "@name", then it is treated as a label - * for a C procedure registered by Itcl_RegisterC(). - * - * If any errors are encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK, and "imPtr" returns a pointer to the new - * member function. - * ------------------------------------------------------------------------ - */ -int -Itcl_ChangeMemberFunc( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclMemberFunc* imPtr, /* command member being changed */ - const char* arglist, /* space-separated list of arg names */ - const char* body) /* body of commands for the method */ -{ - Tcl_HashEntry *hPtr; - ItclMemberCode *mcode = NULL; - int isNewEntry; - - /* - * Try to create the implementation for this command member. - */ - if (ItclCreateMemberCode(interp, imPtr->iclsPtr, - arglist, body, &mcode, imPtr->namePtr, 0) != TCL_OK) { - - return TCL_ERROR; - } - - /* - * If the argument list was defined when the function was - * created, compare the arg lists or usage strings to make sure - * that the interface is not being redefined. - */ - if ((imPtr->flags & ITCL_ARG_SPEC) != 0 && - (imPtr->argListPtr != NULL) && - !EquivArgLists(interp, imPtr->argListPtr, mcode->argListPtr)) { - const char *argsStr; - if (imPtr->origArgsPtr != NULL) { - argsStr = Tcl_GetString(imPtr->origArgsPtr); - } else { - argsStr = ""; - } - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "argument list changed for function \"", - Tcl_GetString(imPtr->fullNamePtr), "\": should be \"", - argsStr, "\"", - (char*)NULL); - - Itcl_DeleteMemberCode((char*)mcode); - return TCL_ERROR; - } - - if (imPtr->flags & ITCL_CONSTRUCTOR) { - /* - * REVISE mcode->bodyPtr here! - * Include a [my ItclConstructBase $iclsPtr] method call. - * Inherited from itcl::Root - */ - - Tcl_Obj *newBody = Tcl_NewStringObj("", -1); - Tcl_AppendToObj(newBody, - "[::info object namespace ${this}]::my ItclConstructBase ", -1); - Tcl_AppendObjToObj(newBody, imPtr->iclsPtr->fullNamePtr); - Tcl_AppendToObj(newBody, "\n", -1); - - Tcl_AppendObjToObj(newBody, mcode->bodyPtr); - Tcl_DecrRefCount(mcode->bodyPtr); - mcode->bodyPtr = newBody; - Tcl_IncrRefCount(mcode->bodyPtr); - } - - /* - * Free up the old implementation and install the new one. - */ - Itcl_PreserveData((ClientData)mcode); - Itcl_EventuallyFree((ClientData)mcode, Itcl_DeleteMemberCode); - - Itcl_ReleaseData((ClientData)imPtr->codePtr); - imPtr->codePtr = mcode; - if (mcode->flags & ITCL_IMPLEMENT_TCL) { - ClientData pmPtr; - imPtr->tmPtr = (ClientData)Itcl_NewProcClassMethod(interp, - imPtr->iclsPtr->clsPtr, ItclCheckCallMethod, ItclAfterCallMethod, - ItclProcErrorProc, imPtr, imPtr->namePtr, mcode->argumentPtr, - mcode->bodyPtr, &pmPtr); - hPtr = Tcl_CreateHashEntry(&imPtr->iclsPtr->infoPtr->procMethods, - (char *)imPtr->tmPtr, &isNewEntry); - if (isNewEntry) { - Tcl_SetHashValue(hPtr, imPtr); - } - } - ItclAddClassFunctionDictInfo(interp, imPtr->iclsPtr, imPtr); - return TCL_OK; -} - -static const char * type_reserved_words [] = { - "type", - "self", - "selfns", - NULL -}; - -/* - * ------------------------------------------------------------------------ - * ItclCreateMemberCode() - * - * Creates the data record representing the implementation behind a - * class member function. This includes the argument list and the body - * of the function. If the body is of the form "@name", then it is - * treated as a label for a C procedure registered by Itcl_RegisterC(). - * - * The implementation is kept by the member function definition, and - * controlled by a preserve/release paradigm. That way, if it is in - * use while it is being redefined, it will stay around long enough - * to avoid a core dump. - * - * If any errors are encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK, and "mcodePtr" returns a pointer to the new - * implementation. - * ------------------------------------------------------------------------ - */ -static int -ItclCreateMemberCode( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class containing this member */ - const char* arglist, /* space-separated list of arg names */ - const char* body, /* body of commands for the method */ - ItclMemberCode** mcodePtr, /* returns: pointer to new implementation */ - Tcl_Obj *namePtr, - int flags) -{ - int argc; - int maxArgc; - Tcl_Obj *usagePtr; - ItclArgList *argListPtr; - ItclMemberCode *mcode; - const char **cPtrPtr; - int haveError; - - /* - * Allocate some space to hold the implementation. - */ - mcode = (ItclMemberCode*)ckalloc(sizeof(ItclMemberCode)); - memset(mcode, 0, sizeof(ItclMemberCode)); - - if (arglist) { - if (ItclCreateArgList(interp, arglist, &argc, &maxArgc, &usagePtr, - &argListPtr, NULL, NULL) != TCL_OK) { - Itcl_DeleteMemberCode((char*)mcode); - return TCL_ERROR; - } - mcode->argcount = argc; - mcode->maxargcount = maxArgc; - mcode->argListPtr = argListPtr; - mcode->usagePtr = usagePtr; - Tcl_IncrRefCount(mcode->usagePtr); - mcode->argumentPtr = Tcl_NewStringObj((const char *)arglist, -1); - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - haveError = 0; - while (argListPtr != NULL) { - cPtrPtr = &type_reserved_words[0]; - while (*cPtrPtr != NULL) { - if ((argListPtr->namePtr != NULL) && - (strcmp(Tcl_GetString(argListPtr->namePtr), - *cPtrPtr) == 0)) { - haveError = 1; - } - if ((flags & ITCL_COMMON) != 0) { - if (! (iclsPtr->infoPtr->functionFlags & - ITCL_TYPE_METHOD)) { - haveError = 0; - } - } - if (haveError) { - const char *startStr = "method "; - if (iclsPtr->infoPtr->functionFlags & - ITCL_TYPE_METHOD) { - startStr = "typemethod "; - } - /* FIXME should use iclsPtr->infoPtr->functionFlags here */ - if ((namePtr != NULL) && - (strcmp(Tcl_GetString(namePtr), - "constructor") == 0)) { - startStr = ""; - } - Tcl_AppendResult(interp, startStr, - namePtr == NULL ? "??" : - Tcl_GetString(namePtr), - "'s arglist may not contain \"", - *cPtrPtr, "\" explicitly", NULL); - Itcl_DeleteMemberCode((char*)mcode); - return TCL_ERROR; - } - cPtrPtr++; - } - argListPtr = argListPtr->nextPtr; - } - } - Tcl_IncrRefCount(mcode->argumentPtr); - mcode->flags |= ITCL_ARG_SPEC; - } else { - argc = 0; - argListPtr = NULL; - } - - if (body) { - mcode->bodyPtr = Tcl_NewStringObj((const char *)body, -1); - } else { - mcode->bodyPtr = Tcl_NewStringObj((const char *)"", -1); - mcode->flags |= ITCL_IMPLEMENT_NONE; - } - Tcl_IncrRefCount(mcode->bodyPtr); - - /* - * If the body definition starts with '@', then treat the value - * as a symbolic name for a C procedure. - */ - if (body == NULL) { - /* No-op */ - } else { - if (*body == '@') { - Tcl_CmdProc *argCmdProc; - Tcl_ObjCmdProc *objCmdProc; - ClientData cdata; - int isDone; - - isDone = 0; - if (strcmp(body, "@itcl-builtin-cget") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-configure") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-isa") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-createhull") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-keepcomponentoption") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-ignorecomponentoption") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-renamecomponentoption") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-addoptioncomponent") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-ignoreoptioncomponent") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-renameoptioncomponent") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-setupcomponent") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-initoptions") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-mytypemethod") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-mymethod") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-myproc") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-mytypevar") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-myvar") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-itcl_hull") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-callinstance") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-getinstancevar") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-installhull") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-installcomponent") == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-destroy") == 0) { - isDone = 1; - } - if (strncmp(body, "@itcl-builtin-setget", 20) == 0) { - isDone = 1; - } - if (strcmp(body, "@itcl-builtin-classunknown") == 0) { - isDone = 1; - } - if (!isDone) { - if (!Itcl_FindC(interp, body+1, &argCmdProc, &objCmdProc, - &cdata)) { - Tcl_AppendResult(interp, - "no registered C procedure with name \"", - body+1, "\"", (char*)NULL); - Itcl_DeleteMemberCode((char*)mcode); - return TCL_ERROR; - } - - /* - * WARNING! WARNING! WARNING! - * This is a pretty dangerous approach. What's done here is - * to copy over the proc + clientData implementation that - * happens to be in place at the moment the method is - * (re-)defined. This denies any freedom for the clientData - * to be changed dynamically or for the implementation to - * shift from OBJCMD to ARGCMD or vice versa, which the - * Itcl_Register(Obj)C routines explicitly permit. The whole - * system also lacks any scheme to unregister. - */ - - if (objCmdProc != NULL) { - mcode->flags |= ITCL_IMPLEMENT_OBJCMD; - mcode->cfunc.objCmd = objCmdProc; - mcode->clientData = cdata; - } else { - if (argCmdProc != NULL) { - mcode->flags |= ITCL_IMPLEMENT_ARGCMD; - mcode->cfunc.argCmd = argCmdProc; - mcode->clientData = cdata; - } - } - } else { - mcode->flags |= ITCL_IMPLEMENT_TCL|ITCL_BUILTIN; - } - } else { - - /* - * Otherwise, treat the body as a chunk of Tcl code. - */ - mcode->flags |= ITCL_IMPLEMENT_TCL; - } - } - - *mcodePtr = mcode; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateMemberCode() - * - * Creates the data record representing the implementation behind a - * class member function. This includes the argument list and the body - * of the function. If the body is of the form "@name", then it is - * treated as a label for a C procedure registered by Itcl_RegisterC(). - * - * The implementation is kept by the member function definition, and - * controlled by a preserve/release paradigm. That way, if it is in - * use while it is being redefined, it will stay around long enough - * to avoid a core dump. - * - * If any errors are encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK, and "mcodePtr" returns a pointer to the new - * implementation. - * ------------------------------------------------------------------------ - */ -int -Itcl_CreateMemberCode( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclClass *iclsPtr, /* class containing this member */ - const char* arglist, /* space-separated list of arg names */ - const char* body, /* body of commands for the method */ - ItclMemberCode** mcodePtr) /* returns: pointer to new implementation */ -{ - return ItclCreateMemberCode(interp, iclsPtr, arglist, body, mcodePtr, - NULL, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteMemberCode() - * - * Destroys all data associated with the given command implementation. - * Invoked automatically by Itcl_ReleaseData() when the implementation - * is no longer being used. - * ------------------------------------------------------------------------ - */ -void -Itcl_DeleteMemberCode( - char* cdata) /* pointer to member code definition */ -{ - ItclMemberCode* mCodePtr; - - mCodePtr = (ItclMemberCode*)cdata; - if (mCodePtr == NULL) { - return; - } - if (mCodePtr->argListPtr != NULL) { - ItclDeleteArgList(mCodePtr->argListPtr); - } - if (mCodePtr->usagePtr != NULL) { - Tcl_DecrRefCount(mCodePtr->usagePtr); - } - if (mCodePtr->argumentPtr != NULL) { - Tcl_DecrRefCount(mCodePtr->argumentPtr); - } - if (mCodePtr->bodyPtr != NULL) { - Tcl_DecrRefCount(mCodePtr->bodyPtr); - } - /* do NOT free mCodePtr->bodyPtr here !! that is done in TclOO!! */ - ckfree((char*)mCodePtr); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_GetMemberCode() - * - * Makes sure that the implementation for an [incr Tcl] code body is - * ready to run. Note that a member function can be declared without - * being defined. The class definition may contain a declaration of - * the member function, but its body may be defined in a separate file. - * If an undefined function is encountered, this routine automatically - * attempts to autoload it. If the body is implemented via Tcl code, - * then it is compiled here as well. - * - * Returns TCL_ERROR (along with an error message in the interpreter) - * if an error is encountered, or if the implementation is not defined - * and cannot be autoloaded. Returns TCL_OK if implementation is - * ready to use. - * ------------------------------------------------------------------------ - */ -int -Itcl_GetMemberCode( - Tcl_Interp* interp, /* interpreter managing this action */ - ItclMemberFunc* imPtr) /* member containing code body */ -{ - int result; - ItclMemberCode *mcode = imPtr->codePtr; - assert(mcode != NULL); - - /* - * If the implementation has not yet been defined, try to - * autoload it now. - */ - - if (!Itcl_IsMemberCodeImplemented(mcode)) { - Tcl_DString buf; - - Tcl_DStringInit(&buf); - Tcl_DStringAppend(&buf, "::auto_load ", -1); - Tcl_DStringAppend(&buf, Tcl_GetString(imPtr->fullNamePtr), -1); - result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), -1, 0); - Tcl_DStringFree(&buf); - if (result != TCL_OK) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while autoloading code for \"%s\")", - Tcl_GetString(imPtr->fullNamePtr))); - return result; - } - Tcl_ResetResult(interp); /* get rid of 1/0 status */ - } - - /* - * If the implementation is still not available, then - * autoloading must have failed. - * - * TRICKY NOTE: If code has been autoloaded, then the - * old mcode pointer is probably invalid. Go back to - * the member and look at the current code pointer again. - */ - mcode = imPtr->codePtr; - assert(mcode != NULL); - - if (!Itcl_IsMemberCodeImplemented(mcode)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "member function \"", Tcl_GetString(imPtr->fullNamePtr), - "\" is not defined and cannot be autoloaded", - (char*)NULL); - return TCL_ERROR; - } - - return TCL_OK; -} - - - -static int -CallItclObjectCmd( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Object oPtr; - ItclMemberFunc *imPtr = data[0]; - ItclObject *ioPtr = data[1]; - int objc = PTR2INT(data[2]); - Tcl_Obj **objv = data[3]; - - ItclShowArgs(1, "CallItclObjectCmd", objc, objv); - if (ioPtr != NULL) { - ioPtr->hadConstructorError = 0; - } - if (imPtr->flags & (ITCL_CONSTRUCTOR|ITCL_DESTRUCTOR)) { - oPtr = ioPtr->oPtr; - } else { - oPtr = NULL; - } - if (oPtr != NULL) { - result = ItclObjectCmd(imPtr, interp, oPtr, imPtr->iclsPtr->clsPtr, - objc, objv); - } else { - result = ItclObjectCmd(imPtr, interp, NULL, NULL, objc, objv); - } - if (result != TCL_OK) { - if (ioPtr != NULL && ioPtr->hadConstructorError == 0) { - /* we are in a constructor call and did not yet have an error */ - /* -1 means we are not in a constructor */ - ioPtr->hadConstructorError = 1; - } - } - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_EvalMemberCode() - * - * Used to execute an ItclMemberCode representation of a code - * fragment. This code may be a body of Tcl commands, or a C handler - * procedure. - * - * Executes the command with the given arguments (objc,objv) and - * returns an integer status code (TCL_OK/TCL_ERROR). Returns the - * result string or an error message in the interpreter. - * ------------------------------------------------------------------------ - */ - -int -Itcl_EvalMemberCode( - Tcl_Interp *interp, /* current interpreter */ - ItclMemberFunc *imPtr, /* member func, or NULL (for error messages) */ - ItclObject *contextIoPtr, /* object context, or NULL */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclMemberCode *mcode; - void *callbackPtr; - int result = TCL_OK; - int i; - - ItclShowArgs(1, "Itcl_EvalMemberCode", objc, objv); - /* - * If this code does not have an implementation yet, then - * try to autoload one. Also, if this is Tcl code, make sure - * that it's compiled and ready to use. - */ - if (Itcl_GetMemberCode(interp, imPtr) != TCL_OK) { - return TCL_ERROR; - } - mcode = imPtr->codePtr; - - /* - * Bump the reference count on this code, in case it is - * redefined or deleted during execution. - */ - Itcl_PreserveData((ClientData)mcode); - - if ((imPtr->flags & ITCL_DESTRUCTOR) && (contextIoPtr != NULL)) { - contextIoPtr->destructorHasBeenCalled = 1; - } - - /* - * Execute the code body... - */ - if (((mcode->flags & ITCL_IMPLEMENT_OBJCMD) != 0) || - ((mcode->flags & ITCL_IMPLEMENT_ARGCMD) != 0)) { - - if ((mcode->flags & ITCL_IMPLEMENT_OBJCMD) != 0) { - result = (*mcode->cfunc.objCmd)(mcode->clientData, - interp, objc, objv); - } else { - if ((mcode->flags & ITCL_IMPLEMENT_ARGCMD) != 0) { - char **argv; - argv = (char**)ckalloc( (unsigned)(objc*sizeof(char*)) ); - for (i=0; i < objc; i++) { - argv[i] = Tcl_GetStringFromObj(objv[i], (int*)NULL); - } - - result = (*mcode->cfunc.argCmd)(mcode->clientData, - interp, objc, (const char **)argv); - - ckfree((char*)argv); - } - } - } else { - if ((mcode->flags & ITCL_IMPLEMENT_TCL) != 0) { - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, CallItclObjectCmd, imPtr, contextIoPtr, - INT2PTR(objc), (void *)objv); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - } - } - - Itcl_ReleaseData((ClientData)mcode); - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclEquivArgLists() - * - * Compares two argument lists to see if they are equivalent. The - * first list is treated as a prototype, and the second list must - * match it. Argument names may be different, but they must match in - * meaning. If one argument is optional, the corresponding argument - * must also be optional. If the prototype list ends with the magic - * "args" argument, then it matches everything in the other list. - * - * Returns non-zero if the argument lists are equivalent. - * ------------------------------------------------------------------------ - */ - -static int -EquivArgLists( - Tcl_Interp *interp, - ItclArgList *origArgs, - ItclArgList *realArgs) -{ - ItclArgList *currPtr; - char *argName; - - for (currPtr=origArgs; currPtr != NULL; currPtr=currPtr->nextPtr) { - if ((realArgs != NULL) && (realArgs->namePtr == NULL)) { - if (currPtr->namePtr != NULL) { - if (strcmp(Tcl_GetString(currPtr->namePtr), "args") != 0) { - /* the definition has more arguments */ - return 0; - } - } - } - if (realArgs == NULL) { - if (currPtr->defaultValuePtr != NULL) { - /* default args must be there ! */ - return 0; - } - if (currPtr->namePtr != NULL) { - if (strcmp(Tcl_GetString(currPtr->namePtr), "args") != 0) { - /* the definition has more arguments */ - return 0; - } - } - return 1; - } - if (currPtr->namePtr == NULL) { - /* no args defined */ - if (realArgs->namePtr != NULL) { - return 0; - } - return 1; - } - argName = Tcl_GetString(currPtr->namePtr); - if (strcmp(argName, "args") == 0) { - if (currPtr->nextPtr == NULL) { - /* this is the last arument */ - return 1; - } - } - if (currPtr->defaultValuePtr != NULL) { - if (realArgs->defaultValuePtr != NULL) { - /* default values must be the same */ - if (strcmp(Tcl_GetString(currPtr->defaultValuePtr), - Tcl_GetString(realArgs->defaultValuePtr)) != 0) { - return 0; - } - } - } - realArgs = realArgs->nextPtr; - } - if ((currPtr == NULL) && (realArgs != NULL)) { - /* new definition has more args then the old one */ - return 0; - } - return 1; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_GetContext() - * - * Convenience routine for looking up the current object/class context. - * Useful in implementing methods/procs to see what class, and perhaps - * what object, is active. - * - * Returns TCL_OK if the current namespace is a class namespace. - * Also returns pointers to the class definition, and to object - * data if an object context is active. Returns TCL_ERROR (along - * with an error message in the interpreter) if a class namespace - * is not active. - * ------------------------------------------------------------------------ - */ - -void -Itcl_SetContext( - Tcl_Interp *interp, - ItclObject *ioPtr) -{ - int new; - Itcl_Stack *stackPtr; - Tcl_CallFrame *framePtr = Itcl_GetUplevelCallFrame(interp, 0); - ItclObjectInfo *infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - Tcl_HashEntry *hPtr = Tcl_CreateHashEntry(&infoPtr->frameContext, - (char *)framePtr, &new); - ItclCallContext *contextPtr - = (ItclCallContext *) ckalloc(sizeof(ItclCallContext)); - - memset(contextPtr, 0, sizeof(ItclCallContext)); - contextPtr->ioPtr = ioPtr; - contextPtr->refCount = 1; - - if (!new) { - Tcl_Panic("frame already has context?!"); - } - - stackPtr = (Itcl_Stack *) ckalloc(sizeof(Itcl_Stack)); - Itcl_InitStack(stackPtr); - Tcl_SetHashValue(hPtr, stackPtr); - - Itcl_PushStack(contextPtr, stackPtr); -} - -void -Itcl_UnsetContext( - Tcl_Interp *interp) -{ - Tcl_CallFrame *framePtr = Itcl_GetUplevelCallFrame(interp, 0); - ItclObjectInfo *infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, - (char *)framePtr); - Itcl_Stack *stackPtr = (Itcl_Stack *) Tcl_GetHashValue(hPtr); - ItclCallContext *contextPtr = Itcl_PopStack(stackPtr); - - if (Itcl_GetStackSize(stackPtr) > 0) { - Tcl_Panic("frame context stack not empty!"); - } - Itcl_DeleteStack(stackPtr); - ckfree((char *) stackPtr); - Tcl_DeleteHashEntry(hPtr); - if (--contextPtr->refCount) { - Tcl_Panic("frame context ref count not zero!"); - } - ckfree((char *)contextPtr); -} - -int -Itcl_GetContext( - Tcl_Interp *interp, /* current interpreter */ - ItclClass **iclsPtrPtr, /* returns: class definition or NULL */ - ItclObject **ioPtrPtr) /* returns: object data or NULL */ -{ - Tcl_Namespace *nsPtr; - - /* Fetch the current call frame. That determines context. */ - Tcl_CallFrame *framePtr = Itcl_GetUplevelCallFrame(interp, 0); - - /* Try to map it to a context stack. */ - ItclObjectInfo *infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, - (char *)framePtr); - if (hPtr) { - /* Frame maps to a context stack. */ - Itcl_Stack *stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - ItclCallContext *contextPtr = Itcl_PeekStack(stackPtr); - - assert(contextPtr); - - if (contextPtr->objectFlags & ITCL_OBJECT_ROOT_METHOD) { - ItclObject *ioPtr = contextPtr->ioPtr; - - *iclsPtrPtr = ioPtr->iclsPtr; - *ioPtrPtr = ioPtr; - return TCL_OK; - } - - *iclsPtrPtr = contextPtr->imPtr ? contextPtr->imPtr->iclsPtr - : contextPtr->ioPtr->iclsPtr; - *ioPtrPtr = contextPtr->ioPtr ? contextPtr->ioPtr : infoPtr->currIoPtr; - return TCL_OK; - } - - /* Frame has no Itcl context data. No way to get object context. */ - *ioPtrPtr = NULL; - - /* Fall back to namespace for possible class context info. */ - nsPtr = Tcl_GetCurrentNamespace(interp); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr) { - *iclsPtrPtr = (ItclClass *)Tcl_GetHashValue(hPtr); - return TCL_OK; - } - - /* Cannot get any context. Record an error message. */ - if (interp) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "namespace \"%s\" is not a class namespace", nsPtr->fullName)); - } - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_GetMemberFuncUsage() - * - * Returns a string showing how a command member should be invoked. - * If the command member is a method, then the specified object name - * is reported as part of the invocation path: - * - * obj method arg ?arg arg ...? - * - * Otherwise, the "obj" pointer is ignored, and the class name is - * used as the invocation path: - * - * class::proc arg ?arg arg ...? - * - * Returns the string by appending it onto the Tcl_Obj passed in as - * an argument. - * ------------------------------------------------------------------------ - */ -void -Itcl_GetMemberFuncUsage( - ItclMemberFunc *imPtr, /* command member being examined */ - ItclObject *contextIoPtr, /* invoked with respect to this object */ - Tcl_Obj *objPtr) /* returns: string showing usage */ -{ - Tcl_HashEntry *entry; - ItclMemberFunc *mf; - ItclClass *iclsPtr; - char *name; - char *arglist; - - /* - * If the command is a method and an object context was - * specified, then add the object context. If the method - * was a constructor, and if the object is being created, - * then report the invocation via the class creation command. - */ - if ((imPtr->flags & ITCL_COMMON) == 0) { - if ((imPtr->flags & ITCL_CONSTRUCTOR) != 0 && - contextIoPtr->constructed) { - - iclsPtr = (ItclClass*)contextIoPtr->iclsPtr; - mf = NULL; - objPtr = Tcl_NewStringObj("constructor", -1); - entry = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (entry) { - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - mf = clookup->imPtr; - } - - if (mf == imPtr) { - Tcl_GetCommandFullName(contextIoPtr->iclsPtr->interp, - contextIoPtr->iclsPtr->accessCmd, objPtr); - Tcl_AppendToObj(objPtr, " ", -1); - name = (char *) Tcl_GetCommandName( - contextIoPtr->iclsPtr->interp, contextIoPtr->accessCmd); - Tcl_AppendToObj(objPtr, name, -1); - } else { - Tcl_AppendToObj(objPtr, Tcl_GetString(imPtr->fullNamePtr), -1); - } - } else { - if (contextIoPtr && contextIoPtr->accessCmd) { - name = (char *) Tcl_GetCommandName( - contextIoPtr->iclsPtr->interp, contextIoPtr->accessCmd); - Tcl_AppendStringsToObj(objPtr, name, " ", - Tcl_GetString(imPtr->namePtr), (char*)NULL); - } else { - Tcl_AppendStringsToObj(objPtr, "<object> ", - Tcl_GetString(imPtr->namePtr), (char*)NULL); - } - } - } else { - Tcl_AppendToObj(objPtr, Tcl_GetString(imPtr->fullNamePtr), -1); - } - - /* - * Add the argument usage info. - */ - if (imPtr->codePtr) { - if (imPtr->codePtr->usagePtr != NULL) { - arglist = Tcl_GetString(imPtr->codePtr->usagePtr); - } else { - arglist = NULL; - } - } else { - if (imPtr->argListPtr != NULL) { - arglist = Tcl_GetString(imPtr->usagePtr); - } else { - arglist = NULL; - } - } - if (arglist) { - if (strlen(arglist) > 0) { - Tcl_AppendToObj(objPtr, " ", -1); - Tcl_AppendToObj(objPtr, arglist, -1); - } - } -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ExecMethod() - * - * Invoked by Tcl to handle the execution of a user-defined method. - * A method is similar to the usual Tcl proc, but has access to - * object-specific data. If for some reason there is no current - * object context, then a method call is inappropriate, and an error - * is returned. - * - * Methods are implemented either as Tcl code fragments, or as C-coded - * procedures. For Tcl code fragments, command arguments are parsed - * according to the argument list, and the body is executed in the - * scope of the class where it was defined. For C procedures, the - * arguments are passed in "as-is", and the procedure is executed in - * the most-specific class scope. - * ------------------------------------------------------------------------ - */ -static int -NRExecMethod( - ClientData clientData, /* method definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const *objv) /* argument objects */ -{ - ItclMemberFunc *imPtr = (ItclMemberFunc*)clientData; - int result = TCL_OK; - - const char *token; - Tcl_HashEntry *entry; - ItclClass *iclsPtr; - ItclObject *ioPtr; - - ItclShowArgs(1, "NRExecMethod", objc, objv); - - /* - * Make sure that the current namespace context includes an - * object that is being manipulated. Methods can be executed - * only if an object context exists. - */ - iclsPtr = imPtr->iclsPtr; - if (Itcl_GetContext(interp, &iclsPtr, &ioPtr) != TCL_OK) { - return TCL_ERROR; - } - if (ioPtr == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot access object-specific info without an object context", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Make sure that this command member can be accessed from - * the current namespace context. - * That is now done in ItclMapMethodNameProc !! - */ - - /* - * All methods should be "virtual" unless they are invoked with - * a "::" scope qualifier. - * - * To implement the "virtual" behavior, find the most-specific - * implementation for the method by looking in the "resolveCmds" - * table for this class. - */ - token = Tcl_GetString(objv[0]); - if (strstr(token, "::") == NULL) { - if (ioPtr != NULL) { - entry = Tcl_FindHashEntry(&ioPtr->iclsPtr->resolveCmds, - (char *)imPtr->namePtr); - - if (entry) { - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - imPtr = clookup->imPtr; - } - } - } - - /* - * Execute the code for the method. Be careful to protect - * the method in case it gets deleted during execution. - */ - ItclPreserveIMF(imPtr); - result = Itcl_EvalMemberCode(interp, imPtr, ioPtr, objc, objv); - ItclReleaseIMF(imPtr); - return result; -} - -/* ARGSUSED */ -int -Itcl_ExecMethod( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRExecMethod, clientData, objc, objv); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ExecProc() - * - * Invoked by Tcl to handle the execution of a user-defined proc. - * - * Procs are implemented either as Tcl code fragments, or as C-coded - * procedures. For Tcl code fragments, command arguments are parsed - * according to the argument list, and the body is executed in the - * scope of the class where it was defined. For C procedures, the - * arguments are passed in "as-is", and the procedure is executed in - * the most-specific class scope. - * ------------------------------------------------------------------------ - */ -static int -NRExecProc( - ClientData clientData, /* proc definition */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclMemberFunc *imPtr = (ItclMemberFunc*)clientData; - int result = TCL_OK; - - ItclShowArgs(1, "NRExecProc", objc, objv); - - /* - * Make sure that this command member can be accessed from - * the current namespace context. - */ - if (imPtr->protection != ITCL_PUBLIC) { - if (!Itcl_CanAccessFunc(imPtr, Tcl_GetCurrentNamespace(interp))) { - ItclMemberFunc *imPtr2 = NULL; - Tcl_HashEntry *hPtr; - Tcl_ObjectContext context; - context = Itcl_GetCallFrameClientData(interp); - if (context == NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "can't access \"", Tcl_GetString(imPtr->fullNamePtr), - "\": ", Itcl_ProtectionStr(imPtr->protection), - " function", (char*)NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&imPtr->iclsPtr->infoPtr->procMethods, - (char *)Tcl_ObjectContextMethod(context)); - if (hPtr != NULL) { - imPtr2 = Tcl_GetHashValue(hPtr); - } - if ((imPtr->protection & ITCL_PRIVATE) && (imPtr2 != NULL) && - (imPtr->iclsPtr->nsPtr != imPtr2->iclsPtr->nsPtr)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid command name \"", - Tcl_GetString(objv[0]), - "\"", NULL); - return TCL_ERROR; - } - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "can't access \"", Tcl_GetString(imPtr->fullNamePtr), - "\": ", Itcl_ProtectionStr(imPtr->protection), - " function", (char*)NULL); - return TCL_ERROR; - } - } - - /* - * Execute the code for the proc. Be careful to protect - * the proc in case it gets deleted during execution. - */ - ItclPreserveIMF(imPtr); - - result = Itcl_EvalMemberCode(interp, imPtr, (ItclObject*)NULL, - objc, objv); - ItclReleaseIMF(imPtr); - return result; -} - -/* ARGSUSED */ -int -Itcl_ExecProc( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - return Tcl_NRCallObjProc(interp, NRExecProc, clientData, objc, objv); -} - -static int -CallInvokeMethodIfExists( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ItclClass *iclsPtr = data[0]; - ItclObject *contextObj = data[1]; - int objc = PTR2INT(data[2]); - Tcl_Obj* const* objv = data[3]; - - result = Itcl_InvokeMethodIfExists(interp, "constructor", - iclsPtr, contextObj, objc, (Tcl_Obj* const*)objv); - - if (result != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_ConstructBase() - * - * Usually invoked just before executing the body of a constructor - * when an object is first created. This procedure makes sure that - * all base classes are properly constructed. If an "initCode" fragment - * was defined with the constructor for the class, then it is invoked. - * After that, the list of base classes is checked for constructors - * that are defined but have not yet been invoked. Each of these is - * invoked implicitly with no arguments. - * - * Assumes that a local call frame is already installed, and that - * constructor arguments have already been matched and are sitting in - * this frame. Returns TCL_OK on success; otherwise, this procedure - * returns TCL_ERROR, along with an error message in the interpreter. - * ------------------------------------------------------------------------ - */ - -int -Itcl_ConstructBase( - Tcl_Interp *interp, /* interpreter */ - ItclObject *contextObj, /* object being constructed */ - ItclClass *contextClass) /* current class being constructed */ -{ - int result = TCL_OK; - Tcl_Obj *objPtr; - Itcl_ListElem *elem; - - /* - * If the class has an "initCode", invoke it in the current context. - */ - - if (contextClass->initCode) { - - /* TODO: NRE */ - result = Tcl_EvalObj(interp, contextClass->initCode); - } - - /* - * Scan through the list of base classes and see if any of these - * have not been constructed. Invoke base class constructors - * implicitly, as needed. Go through the list of base classes - * in reverse order, so that least-specific classes are constructed - * first. - */ - - objPtr = Tcl_NewStringObj("constructor", -1); - Tcl_IncrRefCount(objPtr); - for (elem = Itcl_LastListElem(&contextClass->bases); - result == TCL_OK && elem != NULL; - elem = Itcl_PrevListElem(elem)) { - - Tcl_HashEntry *entry; - ItclClass *iclsPtr = (ItclClass*)Itcl_GetListValue(elem); - - if (Tcl_FindHashEntry(contextObj->constructed, - (char *)iclsPtr->namePtr)) { - - /* Already constructed, nothing to do. */ - continue; - } - - entry = Tcl_FindHashEntry(&iclsPtr->functions, (char *)objPtr); - if (entry) { - void *callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, CallInvokeMethodIfExists, iclsPtr, - contextObj, INT2PTR(0), NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - } else { - result = Itcl_ConstructBase(interp, contextObj, iclsPtr); - } - } - Tcl_DecrRefCount(objPtr); - return result; -} - -int -ItclConstructGuts( - ItclObject *contextObj, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const objv[]) -{ - ItclClass *contextClass; - - /* Ignore syntax error */ - if (objc != 3) { - return TCL_OK; - } - - /* Object is fully constructed. This becomes no-op. */ - if (contextObj->constructed == NULL) { - return TCL_OK; - } - - contextClass = Itcl_FindClass(interp, Tcl_GetString(objv[2]), 0); - if (contextClass == NULL) { - return TCL_OK; - } - - - return Itcl_ConstructBase(interp, contextObj, contextClass); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_InvokeMethodIfExists() - * - * Looks for a particular method in the specified class. If the - * method is found, it is invoked with the given arguments. Any - * protection level (protected/private) for the method is ignored. - * If the method does not exist, this procedure does nothing. - * - * This procedure is used primarily to invoke the constructor/destructor - * when an object is created/destroyed. - * - * Returns TCL_OK on success; otherwise, this procedure returns - * TCL_ERROR along with an error message in the interpreter. - * ------------------------------------------------------------------------ - */ -int -Itcl_InvokeMethodIfExists( - Tcl_Interp *interp, /* interpreter */ - const char *name, /* name of desired method */ - ItclClass *contextClassPtr, /* current class being constructed */ - ItclObject *contextObjectPtr, /* object being constructed */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *cmdlinePtr; - Tcl_Obj **cmdlinev; - Tcl_Obj **newObjv; - Tcl_CallFrame frame; - ItclMemberFunc *imPtr; - int cmdlinec; - int result = TCL_OK; - Tcl_Obj *objPtr = Tcl_NewStringObj(name, -1); - - ItclShowArgs(1, "Itcl_InvokeMethodIfExists", objc, objv); - hPtr = Tcl_FindHashEntry(&contextClassPtr->functions, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr) { - imPtr = (ItclMemberFunc*)Tcl_GetHashValue(hPtr); - - /* - * Prepend the method name to the list of arguments. - */ - cmdlinePtr = Itcl_CreateArgs(interp, name, objc, objv); - - (void) Tcl_ListObjGetElements((Tcl_Interp*)NULL, cmdlinePtr, - &cmdlinec, &cmdlinev); - - ItclShowArgs(1, "EMC", cmdlinec, cmdlinev); - /* - * Execute the code for the method. Be careful to protect - * the method in case it gets deleted during execution. - */ - ItclPreserveIMF(imPtr); - - if (contextObjectPtr->oPtr == NULL) { - Tcl_DecrRefCount(cmdlinePtr); - return TCL_ERROR; - } - result = Itcl_EvalMemberCode(interp, imPtr, contextObjectPtr, - cmdlinec, cmdlinev); - ItclReleaseIMF(imPtr); - Tcl_DecrRefCount(cmdlinePtr); - } else { - if (contextClassPtr->flags & - (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - if (strcmp(name, "constructor") == 0) { - if (objc > 0) { - if (contextClassPtr->numOptions == 0) { - /* check if all options are delegeted */ - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj("*", -1); - hPtr = Tcl_FindHashEntry( - &contextClassPtr->delegatedOptions, - (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "type \"", - Tcl_GetString(contextClassPtr->namePtr), - "\" has no options, but constructor has", - " option arguments", NULL); - return TCL_ERROR; - } - } - if (Itcl_PushCallFrame(interp, &frame, - contextClassPtr->nsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - Tcl_AppendResult(interp, "INTERNAL ERROR in", - "Itcl_InvokeMethodIfExists Itcl_PushCallFrame", - NULL); - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc + 2)); - newObjv[0] = Tcl_NewStringObj("my", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("configure", -1); - Tcl_IncrRefCount(newObjv[1]); - memcpy(newObjv + 2, objv, (objc * sizeof(Tcl_Obj *))); - ItclShowArgs(1, "DEFAULT Constructor", objc + 2, newObjv); - result = Tcl_EvalObjv(interp, objc + 2, newObjv, 0); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[0]); - ckfree((char *)newObjv); - Itcl_PopCallFrame(interp); - } - } - } - } - return result; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ReportFuncErrors() - * - * Used to interpret the status code returned when the body of a - * Tcl-style proc is executed. Handles the "errorInfo" and "errorCode" - * variables properly, and adds error information into the interpreter - * if anything went wrong. Returns a new status code that should be - * treated as the return status code for the command. - * - * This same operation is usually buried in the Tcl InterpProc() - * procedure. It is defined here so that it can be reused more easily. - * ------------------------------------------------------------------------ - */ -int -Itcl_ReportFuncErrors( - Tcl_Interp* interp, /* interpreter being modified */ - ItclMemberFunc *imPtr, /* command member that was invoked */ - ItclObject *contextObj, /* object context for this command */ - int result) /* integer status code from proc body */ -{ -/* FIXME !!! */ -/* adapt to use of ItclProcErrorProc for stubs compatibility !! */ - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CmdAliasProc() - * - * ------------------------------------------------------------------------ - */ -Tcl_Command -Itcl_CmdAliasProc( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *cmdName, - ClientData clientData) -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclObject *ioPtr; - ItclMemberFunc *imPtr; - ItclResolveInfo *resolveInfoPtr; - ItclCmdLookup *clookup; - - resolveInfoPtr = (ItclResolveInfo *)clientData; - if (resolveInfoPtr->flags & ITCL_RESOLVE_OBJECT) { - ioPtr = resolveInfoPtr->ioPtr; - iclsPtr = ioPtr->iclsPtr; - } else { - ioPtr = NULL; - iclsPtr = resolveInfoPtr->iclsPtr; - } - infoPtr = iclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return NULL; - } - iclsPtr = Tcl_GetHashValue(hPtr); - objPtr = Tcl_NewStringObj(cmdName, -1); - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr == NULL) { - if (strcmp(cmdName, "@itcl-builtin-cget") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::cget", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-configure") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::configure", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-destroy") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::destroy", NULL, 0); - } - if (strncmp(cmdName, "@itcl-builtin-setget", 20) == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::setget", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-isa") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::isa", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-createhull") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::createhull", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-keepcomponentoption") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::keepcomponentoption", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-ignorecomponentoption") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::removecomponentoption", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-irgnorecomponentoption") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::ignorecomponentoption", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-setupcomponent") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::setupcomponent", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-initoptions") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::initoptions", NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-mytypemethod") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::mytypemethod", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-mymethod") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::mymethod", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-myproc") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::myproc", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-mytypevar") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::mytypevar", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-myvar") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::myvar", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-itcl_hull") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::itcl_hull", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-callinstance") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::callinstance", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-getinstancevar") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::getinstancevar", - NULL, 0); - } - if (strcmp(cmdName, "@itcl-builtin-classunknown") == 0) { - return Tcl_FindCommand(interp, "::itcl::builtin::classunknown", NULL, 0); - } - return NULL; - } - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - return imPtr->accessCmd; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_VarAliasProc() - * - * ------------------------------------------------------------------------ - */ -Tcl_Var -Itcl_VarAliasProc( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *varName, - ClientData clientData) -{ - - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclObject *ioPtr; - ItclVarLookup *ivlPtr; - ItclResolveInfo *resolveInfoPtr; - ItclCallContext *callContextPtr; - Tcl_Var varPtr; - - varPtr = NULL; - hPtr = NULL; - callContextPtr = NULL; - resolveInfoPtr = (ItclResolveInfo *)clientData; - if (resolveInfoPtr->flags & ITCL_RESOLVE_OBJECT) { - ioPtr = resolveInfoPtr->ioPtr; - iclsPtr = ioPtr->iclsPtr; - } else { - ioPtr = NULL; - iclsPtr = resolveInfoPtr->iclsPtr; - } - infoPtr = iclsPtr->infoPtr; - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr != NULL) { - iclsPtr = Tcl_GetHashValue(hPtr); - } - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, varName); - if (hPtr == NULL) { - /* no class/object variable */ - return NULL; - } - ivlPtr = Tcl_GetHashValue(hPtr); - if (ivlPtr == NULL) { - return NULL; - } - if (!ivlPtr->accessible) { - return NULL; - } - - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectVariables, - (char *)ivlPtr->ivPtr); - } else { - hPtr = Tcl_FindHashEntry(&iclsPtr->classCommons, - (char *)ivlPtr->ivPtr); - if (hPtr == NULL) { - if (callContextPtr != NULL) { - ioPtr = callContextPtr->ioPtr; - } - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectVariables, - (char *)ivlPtr->ivPtr); - } - } - } - if (hPtr != NULL) { - varPtr = Tcl_GetHashValue(hPtr); - } - return varPtr; -} - -/* - * ------------------------------------------------------------------------ - * ItclCheckCallProc() - * - * - * ------------------------------------------------------------------------ - */ -int -ItclCheckCallProc( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, - Tcl_CallFrame *framePtr, - int *isFinished) -{ - int result; - ItclMemberFunc *imPtr; - - imPtr = (ItclMemberFunc *)clientData; - if (!imPtr->iclsPtr->infoPtr->useOldResolvers) { - Itcl_SetCallFrameResolver(interp, imPtr->iclsPtr->resolvePtr); - } - result = TCL_OK; - - if (isFinished != NULL) { - *isFinished = 0; - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclCheckCallMethod() - * - * - * ------------------------------------------------------------------------ - */ -int -ItclCheckCallMethod( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, - Tcl_CallFrame *framePtr, - int *isFinished) -{ - Itcl_Stack *stackPtr; - - Tcl_Object oPtr; - ItclObject *ioPtr; - Tcl_HashEntry *hPtr; - Tcl_Obj *const * cObjv; - Tcl_Namespace *currNsPtr; - ItclCallContext *callContextPtr; - ItclCallContext *callContextPtr2; - ItclMemberFunc *imPtr; - int result; - int isNew; - int cObjc; - int min_allowed_args; - - ItclObjectInfo *infoPtr; - - oPtr = NULL; - hPtr = NULL; - imPtr = (ItclMemberFunc *)clientData; - ItclPreserveIMF(imPtr); - if (imPtr->flags & ITCL_CONSTRUCTOR) { - ioPtr = imPtr->iclsPtr->infoPtr->currIoPtr; - } else { - if (contextPtr == NULL) { - if ((imPtr->flags & ITCL_COMMON) || - (imPtr->codePtr->flags & ITCL_BUILTIN)) { - if (!imPtr->iclsPtr->infoPtr->useOldResolvers) { - Itcl_SetCallFrameResolver(interp, - imPtr->iclsPtr->resolvePtr); - } - if (isFinished != NULL) { - *isFinished = 0; - } - return TCL_OK; - } - Tcl_AppendResult(interp, - "ItclCheckCallMethod cannot get context object (NULL)", - " for ", Tcl_GetString(imPtr->fullNamePtr), - NULL); - result = TCL_ERROR; - goto finishReturn; - } - oPtr = Tcl_ObjectContextObject(contextPtr); - ioPtr = Tcl_ObjectGetMetadata(oPtr, - imPtr->iclsPtr->infoPtr->object_meta_type); - } - if ((imPtr->codePtr != NULL) && - (imPtr->codePtr->flags & ITCL_IMPLEMENT_NONE)) { - Tcl_AppendResult(interp, "member function \"", - Tcl_GetString(imPtr->fullNamePtr), - "\" is not defined and cannot be autoloaded", NULL); - if (isFinished != NULL) { - *isFinished = 1; - } - result = TCL_ERROR; - goto finishReturn; - } - if (framePtr) { - /* - * This stanza is in place to seize control over usage error messages - * before TclOO examines the arguments and produces its own. This - * gives Itcl stability in its error messages at the cost of inconsistency - * with Tcl's evolving conventions. - */ - cObjc = Itcl_GetCallFrameObjc(interp); - cObjv = Itcl_GetCallFrameObjv(interp); - min_allowed_args = cObjc-2; - if (strcmp(Tcl_GetString(cObjv[0]), "next") == 0) { - min_allowed_args++; - } - if (min_allowed_args < imPtr->argcount) { - Tcl_AppendResult(interp, "wrong # args: should be \"", - Tcl_GetString(cObjv[0]), " ", Tcl_GetString(imPtr->namePtr), - " ", Tcl_GetString(imPtr->usagePtr), "\"", NULL); - if (isFinished != NULL) { - *isFinished = 1; - } - result = TCL_ERROR; - goto finishReturn; - } - } - isNew = 0; - callContextPtr = NULL; - currNsPtr = Tcl_GetCurrentNamespace(interp); - if (ioPtr != NULL) { - hPtr = Tcl_CreateHashEntry(&ioPtr->contextCache, (char *)imPtr, &isNew); - if (!isNew) { - callContextPtr2 = Tcl_GetHashValue(hPtr); - if (callContextPtr2->refCount == 0) { - callContextPtr = callContextPtr2; - callContextPtr->objectFlags = ioPtr->flags; - callContextPtr->nsPtr = Tcl_GetCurrentNamespace(interp); - callContextPtr->ioPtr = ioPtr; - callContextPtr->imPtr = imPtr; - callContextPtr->refCount = 1; - } else { - if ((callContextPtr2->objectFlags == ioPtr->flags) - && (callContextPtr2->nsPtr == currNsPtr)) { - callContextPtr = callContextPtr2; - callContextPtr->refCount++; - } - } - } - } - if (callContextPtr == NULL) { - callContextPtr = (ItclCallContext *)ckalloc( - sizeof(ItclCallContext)); - if (ioPtr == NULL) { - callContextPtr->objectFlags = 0; - callContextPtr->ioPtr = NULL; - } else { - callContextPtr->objectFlags = ioPtr->flags; - callContextPtr->ioPtr = ioPtr; - } - callContextPtr->nsPtr = Tcl_GetCurrentNamespace(interp); - callContextPtr->imPtr = imPtr; - callContextPtr->refCount = 1; - } - if (isNew) { - Tcl_SetHashValue(hPtr, callContextPtr); - } - - if (framePtr == NULL) { - framePtr = Itcl_GetUplevelCallFrame(interp, 0); - } - - isNew = 0; - infoPtr = imPtr->iclsPtr->infoPtr; - hPtr = Tcl_CreateHashEntry(&infoPtr->frameContext, - (char *)framePtr, &isNew); - if (isNew) { - stackPtr = (Itcl_Stack *)ckalloc(sizeof(Itcl_Stack)); - Itcl_InitStack(stackPtr); - Tcl_SetHashValue(hPtr, stackPtr); - } else { - stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - } - - assert (callContextPtr) ; - Itcl_PushStack(callContextPtr, stackPtr); - - /* Ugly abuse alert. Two maps in one table */ - hPtr = Tcl_CreateHashEntry(&infoPtr->frameContext, - (char *)contextPtr, &isNew); - if (isNew) { - stackPtr = (Itcl_Stack *)ckalloc(sizeof(Itcl_Stack)); - Itcl_InitStack(stackPtr); - Tcl_SetHashValue(hPtr, stackPtr); - } else { - stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - } - - Itcl_PushStack(framePtr, stackPtr); - - if (ioPtr != NULL) { - ioPtr->callRefCount++; - ItclPreserveObject(ioPtr); - } - imPtr->iclsPtr->callRefCount++; - if (!imPtr->iclsPtr->infoPtr->useOldResolvers) { - Itcl_SetCallFrameResolver(interp, ioPtr->resolvePtr); - } - result = TCL_OK; - - if (isFinished != NULL) { - *isFinished = 0; - } - return result; -finishReturn: - ItclReleaseIMF(imPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclAfterCallMethod() - * - * - * ------------------------------------------------------------------------ - */ -int -ItclAfterCallMethod( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext contextPtr, - Tcl_Namespace *nsPtr, - int call_result) -{ - Tcl_HashEntry *hPtr; - ItclObject *ioPtr; - ItclMemberFunc *imPtr; - ItclCallContext *callContextPtr; - int newEntry; - int result; - - imPtr = (ItclMemberFunc *)clientData; - callContextPtr = NULL; - if (contextPtr != NULL) { - ItclObjectInfo *infoPtr = imPtr->infoPtr; - Tcl_CallFrame *framePtr; - Itcl_Stack *stackPtr; - - hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, (char *)contextPtr); - assert(hPtr); - stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - framePtr = Itcl_PopStack(stackPtr); - if (Itcl_GetStackSize(stackPtr) == 0) { - Itcl_DeleteStack(stackPtr); - ckfree((char *) stackPtr); - Tcl_DeleteHashEntry(hPtr); - } - - hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, (char *)framePtr); - assert(hPtr); - stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - callContextPtr = Itcl_PopStack(stackPtr); - if (Itcl_GetStackSize(stackPtr) == 0) { - Itcl_DeleteStack(stackPtr); - ckfree((char *) stackPtr); - Tcl_DeleteHashEntry(hPtr); - } - } - if (callContextPtr == NULL) { - if ((imPtr->flags & ITCL_COMMON) || - (imPtr->codePtr->flags & ITCL_BUILTIN)) { - result = call_result; - goto finishReturn; - } - Tcl_AppendResult(interp, - "ItclAfterCallMethod cannot get context object (NULL)", - " for ", Tcl_GetString(imPtr->fullNamePtr), NULL); - result = TCL_ERROR; - goto finishReturn; - } - /* - * If this is a constructor or destructor, and if it is being - * invoked at the appropriate time, keep track of which methods - * have been called. This information is used to implicitly - * invoke constructors/destructors as needed. - */ - ioPtr = callContextPtr->ioPtr; - if (ioPtr != NULL) { - if (imPtr->iclsPtr) { - imPtr->iclsPtr->callRefCount--; - if (imPtr->flags & (ITCL_CONSTRUCTOR | ITCL_DESTRUCTOR)) { - if ((imPtr->flags & ITCL_DESTRUCTOR) && ioPtr && - ioPtr->destructed) { - Tcl_CreateHashEntry(ioPtr->destructed, - (char *)imPtr->iclsPtr->namePtr, &newEntry); - } - if ((imPtr->flags & ITCL_CONSTRUCTOR) && ioPtr && - ioPtr->constructed) { - Tcl_CreateHashEntry(ioPtr->constructed, - (char *)imPtr->iclsPtr->namePtr, &newEntry); - } - } - } - ioPtr->callRefCount--; - if (ioPtr->flags & ITCL_OBJECT_SHOULD_VARNS_DELETE) { - ItclDeleteObjectVariablesNamespace(interp, ioPtr); - } - } - - callContextPtr->refCount--; - if (callContextPtr->refCount == 0) { - if (callContextPtr->ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&callContextPtr->ioPtr->contextCache, - (char *)callContextPtr->imPtr); - if (hPtr == NULL) { - ckfree((char *)callContextPtr); - } - ItclReleaseObject(ioPtr); - } else { - ckfree((char *)callContextPtr); - } - } - result = call_result; -finishReturn: - ItclReleaseIMF(imPtr); - return result; -} - -void -ItclProcErrorProc( - Tcl_Interp *interp, - Tcl_Obj *procNameObj) -{ - Tcl_Obj *objPtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclCallContext *callContextPtr; - ItclMemberFunc *imPtr; - ItclObject *contextIoPtr; - ItclClass *currIclsPtr; - char num[20]; - Itcl_Stack *stackPtr; - - /* Fetch the current call frame. That determines context. */ - Tcl_CallFrame *framePtr = Itcl_GetUplevelCallFrame(interp, 0); - - /* Try to map it to a context stack. */ - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->frameContext, (char *)framePtr); - if (hPtr == NULL) { - /* Can this happen? */ - return; - } - - /* Frame maps to a context stack. */ - stackPtr = (Itcl_Stack *)Tcl_GetHashValue(hPtr); - callContextPtr = Itcl_PeekStack(stackPtr); - - if (callContextPtr == NULL) { - return; - } - - currIclsPtr = NULL; - objPtr = NULL; - { - imPtr = callContextPtr->imPtr; - contextIoPtr = callContextPtr->ioPtr; - objPtr = Tcl_NewStringObj("\n ", -1); - - if (imPtr->flags & ITCL_CONSTRUCTOR) { - currIclsPtr = imPtr->iclsPtr; - Tcl_AppendToObj(objPtr, "while constructing object \"", -1); - Tcl_GetCommandFullName(interp, contextIoPtr->accessCmd, objPtr); - Tcl_AppendToObj(objPtr, "\" in ", -1); - Tcl_AppendToObj(objPtr, currIclsPtr->nsPtr->fullName, -1); - Tcl_AppendToObj(objPtr, "::constructor", -1); - if ((imPtr->codePtr->flags & ITCL_IMPLEMENT_TCL) != 0) { - Tcl_AppendToObj(objPtr, " (", -1); - } - } - if (imPtr->flags & ITCL_DESTRUCTOR) { - contextIoPtr->flags = 0; - Tcl_AppendToObj(objPtr, "while deleting object \"", -1); - Tcl_GetCommandFullName(interp, contextIoPtr->accessCmd, objPtr); - Tcl_AppendToObj(objPtr, "\" in ", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(imPtr->fullNamePtr), -1); - if ((imPtr->codePtr->flags & ITCL_IMPLEMENT_TCL) != 0) { - Tcl_AppendToObj(objPtr, " (", -1); - } - } - if (!(imPtr->flags & (ITCL_CONSTRUCTOR|ITCL_DESTRUCTOR))) { - Tcl_AppendToObj(objPtr, "(", -1); - - hPtr = Tcl_FindHashEntry(&infoPtr->objects, (char *)contextIoPtr); - if (hPtr != NULL) { - if ((contextIoPtr != NULL) && (contextIoPtr->accessCmd)) { - Tcl_AppendToObj(objPtr, "object \"", -1); - Tcl_GetCommandFullName(interp, contextIoPtr->accessCmd, objPtr); - Tcl_AppendToObj(objPtr, "\" ", -1); - } - } - - if ((imPtr->flags & ITCL_COMMON) != 0) { - Tcl_AppendToObj(objPtr, "procedure", -1); - } else { - Tcl_AppendToObj(objPtr, "method", -1); - } - Tcl_AppendToObj(objPtr, " \"", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(imPtr->fullNamePtr), -1); - Tcl_AppendToObj(objPtr, "\" ", -1); - } - - if ((imPtr->codePtr->flags & ITCL_IMPLEMENT_TCL) != 0) { - Tcl_Obj *dictPtr; - Tcl_Obj *keyPtr; - Tcl_Obj *valuePtr; - int lineNo; - - keyPtr = Tcl_NewStringObj("-errorline", -1); - dictPtr = Tcl_GetReturnOptions(interp, TCL_ERROR); - if (Tcl_DictObjGet(interp, dictPtr, keyPtr, &valuePtr) != TCL_OK) { - /* how should we handle an error ? */ - Tcl_DecrRefCount(keyPtr); - Tcl_DecrRefCount(objPtr); - return; - } - if (valuePtr == NULL) { - /* how should we handle an error ? */ - Tcl_DecrRefCount(keyPtr); - Tcl_DecrRefCount(objPtr); - return; - } - if (Tcl_GetIntFromObj(interp, valuePtr, &lineNo) != TCL_OK) { - /* how should we handle an error ? */ - Tcl_DecrRefCount(keyPtr); - Tcl_DecrRefCount(valuePtr); - Tcl_DecrRefCount(objPtr); - return; - } - Tcl_DecrRefCount(keyPtr); - Tcl_DecrRefCount(valuePtr); - Tcl_AppendToObj(objPtr, "body line ", -1); - sprintf(num, "%d", lineNo); - Tcl_AppendToObj(objPtr, num, -1); - Tcl_AppendToObj(objPtr, ")", -1); - } else { - Tcl_AppendToObj(objPtr, ")", -1); - } - - Tcl_AppendObjToErrorInfo(interp, objPtr); - objPtr = NULL; - } - if (objPtr != NULL) { - Tcl_DecrRefCount(objPtr); - } -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.c deleted file mode 100644 index 9f035c8..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * This file contains procedures that belong in the Tcl/Tk core. - * Hopefully, they'll migrate there soon. - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include <tclInt.h> -#include "itclInt.h" - -int -Itcl_SetCallFrameResolver( - Tcl_Interp *interp, - Tcl_Resolve *resolvePtr) -{ - CallFrame *framePtr = ((Interp *)interp)->framePtr; - if (framePtr != NULL) { -#ifdef ITCL_USE_MODIFIED_TCL_H - framePtr->isProcCallFrame |= FRAME_HAS_RESOLVER; - framePtr->resolvePtr = resolvePtr; -#endif - return TCL_OK; - } - return TCL_ERROR; -} - -int -_Tcl_SetNamespaceResolver( - Tcl_Namespace *nsPtr, - Tcl_Resolve *resolvePtr) -{ - if (nsPtr == NULL) { - return TCL_ERROR; - } -#ifdef ITCL_USE_MODIFIED_TCL_H - ((Namespace *)nsPtr)->resolvePtr = resolvePtr; -#endif - return TCL_OK; -} - -Tcl_Var -Tcl_NewNamespaceVar( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *varName) -{ - Var *varPtr = NULL; - int new; - - if ((nsPtr == NULL) || (varName == NULL)) { - return NULL; - } - - varPtr = TclVarHashCreateVar(&((Namespace *)nsPtr)->varTable, - varName, &new); - TclSetVarNamespaceVar(varPtr); - return (Tcl_Var)varPtr; -} - -void -Itcl_PreserveVar( - Tcl_Var var) -{ - Var *varPtr = (Var *)var; - - VarHashRefCount(varPtr)++; -} - -void -Itcl_ReleaseVar( - Tcl_Var var) -{ - Var *varPtr = (Var *)var; - - VarHashRefCount(varPtr)--; - TclCleanupVar(varPtr, NULL); -} - -Tcl_CallFrame * -Itcl_GetUplevelCallFrame( - Tcl_Interp *interp, - int level) -{ - CallFrame *framePtr; - if (level < 0) { - return NULL; - } - framePtr = ((Interp *)interp)->varFramePtr; - while ((framePtr != NULL) && (level-- > 0)) { - framePtr = framePtr->callerVarPtr; - } - if (framePtr == NULL) { - return NULL; - } - return (Tcl_CallFrame *)framePtr; -} - -Tcl_CallFrame * -Itcl_ActivateCallFrame( - Tcl_Interp *interp, - Tcl_CallFrame *framePtr) -{ - Interp *iPtr = (Interp*)interp; - CallFrame *oldFramePtr; - - oldFramePtr = iPtr->varFramePtr; - iPtr->varFramePtr = (CallFrame *) framePtr; - - return (Tcl_CallFrame *) oldFramePtr; -} - -Tcl_Namespace * -Itcl_GetUplevelNamespace( - Tcl_Interp *interp, - int level) -{ - CallFrame *framePtr; - if (level < 0) { - return NULL; - } - framePtr = ((Interp *)interp)->framePtr; - while ((framePtr != NULL) && (level-- > 0)) { - framePtr = framePtr->callerVarPtr; - } - if (framePtr == NULL) { - return NULL; - } - return (Tcl_Namespace *)framePtr->nsPtr; -} - -ClientData -Itcl_GetCallFrameClientData( - Tcl_Interp *interp) -{ - /* suggested fix for SF bug #250 use varFramePtr instead of framePtr - * seems to have no side effect concerning test suite, but does NOT fix the bug - */ - CallFrame *framePtr = ((Interp *)interp)->varFramePtr; - if (framePtr == NULL) { - return NULL; - } - return framePtr->clientData; -} - -int -Itcl_SetCallFrameNamespace( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr) -{ - CallFrame *framePtr = ((Interp *)interp)->varFramePtr; - if (framePtr == NULL) { - return TCL_ERROR; - } - ((Interp *)interp)->varFramePtr->nsPtr = (Namespace *)nsPtr; - return TCL_OK; -} - -int -Itcl_GetCallVarFrameObjc( - Tcl_Interp *interp) -{ - CallFrame *framePtr = ((Interp *)interp)->varFramePtr; - if (framePtr == NULL) { - return 0; - } - return framePtr->objc; -} - -Tcl_Obj * const * -Itcl_GetCallVarFrameObjv( - Tcl_Interp *interp) -{ - CallFrame *framePtr = ((Interp *)interp)->varFramePtr; - if (framePtr == NULL) { - return NULL; - } - return framePtr->objv; -} - -int -Itcl_GetCallFrameObjc( - Tcl_Interp *interp) -{ - CallFrame *framePtr = ((Interp *)interp)->framePtr; - if (framePtr == NULL) { - return 0; - } - return ((Interp *)interp)->framePtr->objc; -} - -Tcl_Obj * const * -Itcl_GetCallFrameObjv( - Tcl_Interp *interp) -{ - CallFrame *framePtr = ((Interp *)interp)->framePtr; - if (framePtr == NULL) { - return NULL; - } - return ((Interp *)interp)->framePtr->objv; -} - -int -Itcl_IsCallFrameArgument( - Tcl_Interp *interp, - const char *name) -{ - CallFrame *varFramePtr = ((Interp *)interp)->framePtr; - Proc *procPtr; - - if (varFramePtr == NULL) { - return 0; - } - if (!varFramePtr->isProcCallFrame) { - return 0; - } - procPtr = varFramePtr->procPtr; - /* - * Search through compiled locals first... - */ - if (procPtr) { - CompiledLocal *localPtr = procPtr->firstLocalPtr; - int nameLen = strlen(name); - - for (;localPtr != NULL; localPtr = localPtr->nextPtr) { - if (TclIsVarArgument(localPtr)) { - register char *localName = localPtr->name; - if ((name[0] == localName[0]) - && (nameLen == localPtr->nameLength) - && (strcmp(name, localName) == 0)) { - return 1; - } - } - } - } - return 0; -} - -int -Itcl_IsCallFrameLinkVar( - Tcl_Interp *interp, - const char *name) -{ - CallFrame *varFramePtr = ((Interp *)interp)->framePtr; - Proc *procPtr; - - if (varFramePtr == NULL) { - return 0; - } - if (!varFramePtr->isProcCallFrame) { - return 0; - } - procPtr = varFramePtr->procPtr; - /* - * Search through compiled locals first... - */ - if (procPtr) { - CompiledLocal *localPtr = procPtr->firstLocalPtr; - int nameLen = strlen(name); - - for (;localPtr != NULL; localPtr = localPtr->nextPtr) { - if (TclIsVarLink(localPtr)) { - register char *localName = localPtr->name; - if ((name[0] == localName[0]) - && (nameLen == localPtr->nameLength) - && (strcmp(name, localName) == 0)) { - return 1; - } - } - } - } - return 0; -} - -int -Itcl_IsVarLink(Tcl_Var varPtr) { - return TclIsVarLink((Var *)varPtr); -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.h deleted file mode 100644 index 012ea0b..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclMigrate2TclCore.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef ITCL_USE_MODIFIED_TCL_H -/* this is just to provide the definition. This struct is only used if - * infoPtr->useOldResolvers == 0 which is not the default - */ -#define FRAME_HAS_RESOLVER 0x100 -typedef Tcl_Command (Tcl_CmdAliasProc)(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *cmdName, - ClientData clientData); -typedef Tcl_Var (Tcl_VarAliasProc)(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *varName, - ClientData clientData); - -#ifndef _TCL_RESOLVE_DEFINED -typedef struct Tcl_Resolve { - Tcl_VarAliasProc *varProcPtr; - Tcl_CmdAliasProc *cmdProcPtr; - ClientData clientData; -} Tcl_Resolve; -#define _TCL_RESOLVE_DEFINED 1 -#endif -#endif - -#ifndef _TCLINT -struct Tcl_ResolvedVarInfo; - -typedef Tcl_Var (Tcl_ResolveRuntimeVarProc)(Tcl_Interp *interp, - struct Tcl_ResolvedVarInfo *vinfoPtr); - -typedef void (Tcl_ResolveVarDeleteProc)(struct Tcl_ResolvedVarInfo *vinfoPtr); - -/* - * The following structure encapsulates the routines needed to resolve a - * variable reference at runtime. Any variable specific state will typically - * be appended to this structure. - */ - -typedef struct Tcl_ResolvedVarInfo { - Tcl_ResolveRuntimeVarProc *fetchProc; - Tcl_ResolveVarDeleteProc *deleteProc; -} Tcl_ResolvedVarInfo; - -typedef int (Tcl_ResolveCompiledVarProc) (Tcl_Interp *interp, - const char *name, int length, Tcl_Namespace *context, - Tcl_ResolvedVarInfo **rPtr); - -typedef int (Tcl_ResolveVarProc) (Tcl_Interp *interp, const char *name, - Tcl_Namespace *context, int flags, Tcl_Var *rPtr); - -typedef int (Tcl_ResolveCmdProc) (Tcl_Interp *interp, const char *name, - Tcl_Namespace *context, int flags, Tcl_Command *rPtr); - -typedef struct Tcl_ResolverInfo { - Tcl_ResolveCmdProc *cmdResProc; - /* Procedure handling command name - * resolution. */ - Tcl_ResolveVarProc *varResProc; - /* Procedure handling variable name resolution - * for variables that can only be handled at - * runtime. */ - Tcl_ResolveCompiledVarProc *compiledVarResProc; - /* Procedure handling variable name resolution - * at compile time. */ -} Tcl_ResolverInfo; -#endif - - -/* here come the definitions for code which should be migrated to Tcl core */ -/* these functions DO NOT exist and are not published */ -#ifndef _TCL_PROC_DEFINED -typedef struct Tcl_Proc_ *Tcl_Proc; -#define _TCL_PROC_DEFINED 1 -#endif - -#define Tcl_SetProcCmd _Tcl_SetProcCmd - -MODULE_SCOPE Tcl_Var Tcl_NewNamespaceVar(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - const char *varName); -MODULE_SCOPE void Itcl_PreserveVar(Tcl_Var var); -MODULE_SCOPE void Itcl_ReleaseVar(Tcl_Var var); -MODULE_SCOPE int Itcl_IsCallFrameArgument(Tcl_Interp *interp, const char *name); -MODULE_SCOPE int Itcl_GetCallVarFrameObjc(Tcl_Interp *interp); -MODULE_SCOPE int Itcl_IsVarLink(Tcl_Var var); -MODULE_SCOPE int Itcl_IsCallFrameLinkVar(Tcl_Interp *interp, const char *name); -MODULE_SCOPE Tcl_Obj * const * Itcl_GetCallVarFrameObjv(Tcl_Interp *interp); -#define Tcl_SetNamespaceResolver _Tcl_SetNamespaceResolver -MODULE_SCOPE int _Tcl_SetNamespaceResolver(Tcl_Namespace *nsPtr, - struct Tcl_Resolve *resolvePtr); diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclObject.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclObject.c deleted file mode 100644 index 2e60c97..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclObject.c +++ /dev/null @@ -1,3845 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This segment handles "objects" which are instantiated from class - * definitions. Objects contain public/protected/private data members - * from all classes in a derivation hierarchy. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann Copyright (c) 2007 - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include <tclInt.h> -#include "itclInt.h" - -/* - * FORWARD DECLARATIONS - */ -static char* ItclTraceThisVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceTypeVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceSelfVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceSelfnsVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceWinVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceOptionVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceComponentVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); -static char* ItclTraceItclHullVar(ClientData cdata, Tcl_Interp *interp, - const char *name1, const char *name2, int flags); - -static void ItclDestroyObject(ClientData clientData); -static void ItclFreeObject(char * clientData); - -static int ItclDestructBase(Tcl_Interp *interp, ItclObject *contextObj, - ItclClass *contextClass, int flags); - -static int ItclInitObjectVariables(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr); -static int ItclInitObjectCommands(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr, const char *name); -static int ItclInitExtendedClassOptions(Tcl_Interp *interp, ItclObject *ioPtr); -static int ItclInitObjectOptions(Tcl_Interp *interp, ItclObject *ioPtr, - ItclClass *iclsPtr); -static const char * GetConstructorVar(Tcl_Interp *interp, ItclClass *iclsPtr, - const char *varName); -static ItclClass * GetClassFromClassName(Tcl_Interp *interp, - const char *className, ItclClass *iclsPtr); - -void -ItclPreserveObject( - ItclObject *ioPtr) -{ - ioPtr->refCount++; -} - -void -ItclReleaseObject( - ClientData clientData) -{ - ItclObject *ioPtr = (ItclObject *)clientData; - - if (--ioPtr->refCount == 0) { - ItclFreeObject((char *) clientData); - } -} - - -/* - * ------------------------------------------------------------------------ - * ItclDeleteObjectMetadata() - * - * Delete the metadata data if any - *------------------------------------------------------------------------- - */ -void -ItclDeleteObjectMetadata( - ClientData clientData) -{ - ItclObject *ioPtr = (ItclObject *)clientData; - Tcl_HashEntry *hPtr; - - if (ioPtr == NULL) return; /* Safety */ - if (ioPtr->oPtr == NULL) return; /* Safety */ - - hPtr = Tcl_FindHashEntry(&ioPtr->infoPtr->instances, - (Tcl_GetObjectNamespace(ioPtr->oPtr))->fullName); - - if (hPtr == NULL) return; - - if (clientData != Tcl_GetHashValue(hPtr)) { - Tcl_Panic("invalid instances entry"); - } - Tcl_DeleteHashEntry(hPtr); -} - -/* - * ------------------------------------------------------------------------ - * ObjectRenamedTrace() - * - * ------------------------------------------------------------------------ - */ - -static void -ObjectRenamedTrace( - ClientData clientData, /* The object being deleted. */ - Tcl_Interp *interp, /* The interpreter containing the object. */ - const char *oldName, /* What the object was (last) called. */ - const char *newName, /* Always NULL ??. not for itk!! */ - int flags) /* Why was the object deleted? */ -{ - ItclObject *ioPtr = clientData; - Itcl_InterpState istate; - - if (newName != NULL) { - /* FIXME should enter the new name in the hashtables for objects etc. */ - return; - } - if (ioPtr->flags & ITCL_OBJECT_CLASS_DESTRUCTED) { - return; - } - ioPtr->flags |= ITCL_OBJECT_IS_RENAMED; - if (ioPtr->flags & ITCL_TCLOO_OBJECT_IS_DELETED) { - ioPtr->oPtr = NULL; - } - if (!(ioPtr->flags & ITCL_OBJECT_CLASS_DESTRUCTED)) { - /* - * Attempt to destruct the object, but ignore any errors. - */ - istate = Itcl_SaveInterpState(ioPtr->interp, 0); - Itcl_DestructObject(ioPtr->interp, ioPtr, ITCL_IGNORE_ERRS); - Itcl_RestoreInterpState(ioPtr->interp, istate); - ioPtr->flags |= ITCL_OBJECT_CLASS_DESTRUCTED; - } -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateObject() - * - */ -int -Itcl_CreateObject( - Tcl_Interp *interp, /* interpreter mananging new object */ - const char* name, /* name of new object */ - ItclClass *iclsPtr, /* class for new object */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[], /* argument objects */ - ItclObject **rioPtr) /* the created object */ -{ - int result; - ItclObjectInfo * infoPtr; - - result = ItclCreateObject(interp, name, iclsPtr, objc, objv); - if (result == TCL_OK) { - if (!(iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, name, NULL); - } - } - if (rioPtr != NULL) { - if (result == TCL_OK) { - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - *rioPtr = infoPtr->lastIoPtr; - } else { - *rioPtr = NULL; - } - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclCreateObject() - * - * Creates a new object instance belonging to the given class. - * Supports complex object names like "namesp::namesp::name" by - * following the namespace path and creating the object in the - * desired namespace. - * - * Automatically creates and initializes data members, including the - * built-in protected "this" variable containing the object name. - * Installs an access command in the current namespace, and invokes - * the constructor to initialize the object. - * - * If any errors are encountered, the object is destroyed and this - * procedure returns TCL_ERROR (along with an error message in the - * interpreter). Otherwise, it returns TCL_OK - * ------------------------------------------------------------------------ - */ -int -ItclCreateObject( - Tcl_Interp *interp, /* interpreter mananging new object */ - const char* name, /* name of new object */ - ItclClass *iclsPtr, /* class for new object */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - int result = TCL_OK; - - Tcl_DString buffer; - Tcl_CmdInfo cmdInfo; - Tcl_Command cmdPtr; - Tcl_HashEntry *hPtr; - Tcl_Obj **newObjv; - Tcl_Obj *objPtr; - Tcl_Obj *saveNsNamePtr = NULL; - ItclObjectInfo *infoPtr; - ItclObject *saveCurrIoPtr; - ItclObject *ioPtr; - Itcl_InterpState istate; - const char *nsName; - const char *objName; - char unique[256]; /* buffer used for unique part of object names */ - int newEntry; - ItclResolveInfo *resolveInfoPtr; - /* objv[1]: class name */ - /* objv[2]: class full name */ - /* objv[3]: object name */ - - infoPtr = NULL; - ItclShowArgs(1, "ItclCreateObject", objc, objv); - saveCurrIoPtr = NULL; - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - /* check, if the object already exists and if yes delete it silently */ - cmdPtr = Tcl_FindCommand(interp, name, NULL, 0); - if (cmdPtr != NULL) { - Tcl_GetCommandInfoFromToken(cmdPtr, &cmdInfo); - if (cmdInfo.deleteProc == ItclDestroyObject) { - Itcl_RenameCommand(interp, name, ""); - } - } - } - /* just init for the case of none ItclWidget objects */ - newObjv = (Tcl_Obj **)objv; - infoPtr = iclsPtr->infoPtr; - - if (infoPtr != NULL) { - infoPtr->lastIoPtr = NULL; - } - /* - * Create a new object and initialize it. - */ - ioPtr = (ItclObject*)ckalloc(sizeof(ItclObject)); - memset(ioPtr, 0, sizeof(ItclObject)); - ioPtr->iclsPtr = iclsPtr; - ioPtr->interp = interp; - ioPtr->infoPtr = infoPtr; - ItclPreserveClass(iclsPtr); - - ioPtr->constructed = (Tcl_HashTable*)ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitObjHashTable(ioPtr->constructed); - - ioPtr->oPtr = Tcl_NewObjectInstance(interp, iclsPtr->clsPtr, NULL, - /* nsName */ NULL, /* objc */ -1, /* objv */ NULL, /* skip */ 0); - if (ioPtr->oPtr == NULL) { - ckfree(ioPtr); - return TCL_ERROR; - } - - /* - * Add a command to the current namespace with the object name. - * This is done before invoking the constructors so that the - * command can be used during construction to query info. - */ - ItclPreserveObject(ioPtr); - - ioPtr->namePtr = Tcl_NewStringObj(name, -1); - Tcl_IncrRefCount(ioPtr->namePtr); - nsName = Tcl_GetCurrentNamespace(interp)->fullName; - ioPtr->origNamePtr = Tcl_NewStringObj("", -1); - if ((name[0] != ':') && (name[1] != ':')) { - Tcl_AppendToObj(ioPtr->origNamePtr, nsName, -1); - if (strcmp(nsName, "::") != 0) { - Tcl_AppendToObj(ioPtr->origNamePtr, "::", -1); - } - } - Tcl_AppendToObj(ioPtr->origNamePtr, name, -1); - Tcl_IncrRefCount(ioPtr->origNamePtr); - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(ioPtr->oPtr))->fullName, -1); - ioPtr->varNsNamePtr = Tcl_NewStringObj(Tcl_DStringValue(&buffer), -1); - Tcl_IncrRefCount(ioPtr->varNsNamePtr); - Tcl_DStringFree(&buffer); - - Tcl_InitHashTable(&ioPtr->objectVariables, TCL_ONE_WORD_KEYS); - Tcl_InitObjHashTable(&ioPtr->objectOptions); - Tcl_InitObjHashTable(&ioPtr->objectComponents); - Tcl_InitObjHashTable(&ioPtr->objectDelegatedOptions); - Tcl_InitObjHashTable(&ioPtr->objectDelegatedFunctions); - Tcl_InitObjHashTable(&ioPtr->objectMethodVariables); - Tcl_InitHashTable(&ioPtr->contextCache, TCL_ONE_WORD_KEYS); - - ItclPreserveObject(ioPtr); - - /* - * Install the class namespace and object context so that - * the object's data members can be initialized via simple - * "set" commands. - */ - - /* first create the object's class variables namespaces - * and set all the init values for variables - */ - - if (ItclInitObjectVariables(interp, ioPtr, iclsPtr) != TCL_OK) { - ioPtr->hadConstructorError = 11; - result = TCL_ERROR; - goto errorReturn; - } - if (ItclInitObjectCommands(interp, ioPtr, iclsPtr, name) != TCL_OK) { - Tcl_AppendResult(interp, "error in ItclInitObjectCommands", NULL); - ioPtr->hadConstructorError = 12; - result = TCL_ERROR; - goto errorReturn; - } - if (iclsPtr->flags & (ITCL_ECLASS|ITCL_NWIDGET|ITCL_WIDGET| - ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - if (iclsPtr->flags & (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET| - ITCL_WIDGETADAPTOR)) { - ItclInitExtendedClassOptions(interp, ioPtr); - if (ItclInitObjectOptions(interp, ioPtr, iclsPtr) != TCL_OK) { - Tcl_AppendResult(interp, "error in ItclInitObjectOptions", - NULL); - ioPtr->hadConstructorError = 13; - result = TCL_ERROR; - goto errorReturn; - } - } - if (ItclInitObjectMethodVariables(interp, ioPtr, iclsPtr, name) - != TCL_OK) { - Tcl_AppendResult(interp, - "error in ItclInitObjectMethodVariables", NULL); - ioPtr->hadConstructorError = 14; - result = TCL_ERROR; - goto errorReturn; - } - - if (iclsPtr->flags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - saveNsNamePtr = Tcl_GetVar2Ex(interp, - "::itcl::internal::varNsName", name, 0); - if (saveNsNamePtr) { - Tcl_IncrRefCount(saveNsNamePtr); - } - Tcl_SetVar2Ex(interp, "::itcl::internal::varNsName", name, - ioPtr->varNsNamePtr, 0); - } - - } - - saveCurrIoPtr = infoPtr->currIoPtr; - infoPtr->currIoPtr = ioPtr; - if (iclsPtr->flags & ITCL_WIDGET) { - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc + 5)); - newObjv[0] = Tcl_NewStringObj( - "::itcl::internal::commands::hullandoptionsinstall", -1); - newObjv[1] = ioPtr->namePtr; - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = ioPtr->iclsPtr->namePtr; - Tcl_IncrRefCount(newObjv[2]); - if (ioPtr->iclsPtr->widgetClassPtr != NULL) { - newObjv[3] = ioPtr->iclsPtr->widgetClassPtr; - } else { - newObjv[3] = Tcl_NewStringObj("", -1); - } - Tcl_IncrRefCount(newObjv[3]); - if (ioPtr->iclsPtr->hullTypePtr != NULL) { - newObjv[4] = ioPtr->iclsPtr->hullTypePtr; - } else { - newObjv[4] = Tcl_NewStringObj("", -1); - } - Tcl_IncrRefCount(newObjv[4]); - memcpy(newObjv + 5, objv, (objc * sizeof(Tcl_Obj *))); - result = Tcl_EvalObjv(interp, objc+5, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[3]); - Tcl_DecrRefCount(newObjv[4]); - ckfree((char *)newObjv); - if (result != TCL_OK) { - ioPtr->hadConstructorError = 15; - goto errorReturn; - } - } - objName = name; - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - /* use a temporary name here as widgetadaptors often hijack the - * name for use in installhull. Rename it after the constructor has - * been run to the wanted name - */ - /* - * Add a unique part, and keep - * incrementing a counter until a valid name is found. - */ - do { - Tcl_CmdInfo dummy; - - sprintf(unique,"%.200s_%d", name, iclsPtr->unique++); - unique[0] = tolower(UCHAR(unique[0])); - - Tcl_DStringSetLength(&buffer, 0); - Tcl_DStringAppend(&buffer, unique, -1); - objName = Tcl_DStringValue(&buffer); - - /* - * [Fix 227811] Check for any command with the - * given name, not only objects. - */ - - if (Tcl_GetCommandInfo (interp, objName, &dummy) == 0) { - break; /* if an error is found, bail out! */ - } - } while (1); - ioPtr->createNamePtr = Tcl_NewStringObj(objName, -1); - } - - { - Tcl_Obj *tmp = Tcl_NewObj(); - - Tcl_GetCommandFullName(interp, Tcl_GetObjectCommand(ioPtr->oPtr), tmp); - Itcl_RenameCommand(interp, Tcl_GetString(tmp), objName); - Tcl_TraceCommand(interp, objName, - TCL_TRACE_RENAME|TCL_TRACE_DELETE, ObjectRenamedTrace, ioPtr); - Tcl_DecrRefCount(tmp); - } - Tcl_ObjectSetMethodNameMapper(ioPtr->oPtr, ItclMapMethodNameProc); - - ioPtr->accessCmd = Tcl_GetObjectCommand(ioPtr->oPtr); - Tcl_GetCommandInfoFromToken(ioPtr->accessCmd, &cmdInfo); - cmdInfo.deleteProc = (void *)ItclDestroyObject; - cmdInfo.deleteData = ioPtr; - Tcl_SetCommandInfoFromToken(ioPtr->accessCmd, &cmdInfo); - ioPtr->resolvePtr = (Tcl_Resolve *)ckalloc(sizeof(Tcl_Resolve)); - ioPtr->resolvePtr->cmdProcPtr = Itcl_CmdAliasProc; - ioPtr->resolvePtr->varProcPtr = Itcl_VarAliasProc; - resolveInfoPtr = (ItclResolveInfo *)ckalloc(sizeof(ItclResolveInfo)); - memset (resolveInfoPtr, 0, sizeof(ItclResolveInfo)); - resolveInfoPtr->flags = ITCL_RESOLVE_OBJECT; - resolveInfoPtr->ioPtr = ioPtr; - ioPtr->resolvePtr->clientData = resolveInfoPtr; - - Tcl_ObjectSetMetadata(ioPtr->oPtr, iclsPtr->infoPtr->object_meta_type, - ioPtr); - - /* make the object known, if it is used in the constructor already! */ - hPtr = Tcl_CreateHashEntry(&iclsPtr->infoPtr->objectCmds, - (char*)ioPtr->accessCmd, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ioPtr); - - hPtr = Tcl_CreateHashEntry(&iclsPtr->infoPtr->objects, - (char*)ioPtr, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ioPtr); - - /* Use the TclOO object namespaces as a unique key in case the - * object is renamed. Used by mytypemethod, etc. */ - - hPtr = Tcl_CreateHashEntry(&iclsPtr->infoPtr->instances, - (Tcl_GetObjectNamespace(ioPtr->oPtr))->fullName, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ioPtr); - - /* - * Now construct the object. Look for a constructor in the - * most-specific class, and if there is one, invoke it. - * This will cause a chain reaction, making sure that all - * base classes constructors are invoked as well, in order - * from least- to most-specific. Any constructors that are - * not called out explicitly in "initCode" code fragments are - * invoked implicitly without arguments. - */ - ItclShowArgs(1, "OBJECTCONSTRUCTOR", objc, objv); - ioPtr->hadConstructorError = 0; - result = Itcl_InvokeMethodIfExists(interp, "constructor", - iclsPtr, ioPtr, objc, objv); - if (ioPtr->hadConstructorError) { - result = TCL_ERROR; - } - ioPtr->hadConstructorError = -1; - if (result != TCL_OK) { - istate = Itcl_SaveInterpState(interp, result); - ItclDeleteObjectVariablesNamespace(interp, ioPtr); - if (ioPtr->accessCmd != (Tcl_Command) NULL) { - Tcl_DeleteCommandFromToken(interp, ioPtr->accessCmd); - ioPtr->accessCmd = NULL; - } - result = Itcl_RestoreInterpState(interp, istate); - infoPtr->currIoPtr = saveCurrIoPtr; - /* need this for 2 ReleaseData at errorReturn!! */ - ItclPreserveObject(ioPtr); - goto errorReturn; - } else { - /* a constructor cannot return a result as the object name - * is returned as result */ - Tcl_ResetResult(interp); - } - - /* - * If there is no constructor, construct the base classes - * in case they have constructors. This will cause the - * same chain reaction. - */ - objPtr = Tcl_NewStringObj("constructor", -1); - if (Tcl_FindHashEntry(&iclsPtr->functions, (char *)objPtr) == NULL) { - result = Itcl_ConstructBase(interp, ioPtr, iclsPtr); - } - Tcl_DecrRefCount(objPtr); - - if (iclsPtr->flags & ITCL_ECLASS) { - ItclInitExtendedClassOptions(interp, ioPtr); - if (ItclInitObjectOptions(interp, ioPtr, iclsPtr) != TCL_OK) { - Tcl_AppendResult(interp, "error in ItclInitObjectOptions", - NULL); - result = TCL_ERROR; - goto errorReturn; - } - } - /* - * If construction failed, then delete the object access - * command. This will destruct the object and delete the - * object data. Be careful to save and restore the interpreter - * state, since the destructors may generate errors of their own. - */ - if (result != TCL_OK) { - istate = Itcl_SaveInterpState(interp, result); - - /* Bug 227824. - * The constructor may destroy the object, possibly indirectly - * through the destruction of the main widget in the iTk - * megawidget it tried to construct. If this happens we must - * not try to destroy the access command a second time. - */ - if (ioPtr->accessCmd != (Tcl_Command) NULL) { - Tcl_DeleteCommandFromToken(interp, ioPtr->accessCmd); - ioPtr->accessCmd = NULL; - } - result = Itcl_RestoreInterpState(interp, istate); - /* need this for 2 ReleaseData at errorReturn!! */ - ItclPreserveObject(ioPtr); - goto errorReturn; - } - - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - - if (saveNsNamePtr) { - Tcl_SetVar2Ex(interp, "::itcl::internal::varNsName", name, - saveNsNamePtr, 0); - Tcl_DecrRefCount(saveNsNamePtr); - saveNsNamePtr = NULL; - } - - Itcl_RenameCommand(interp, objName, name); - ioPtr->createNamePtr = NULL; - Tcl_TraceCommand(interp, Tcl_GetString(ioPtr->namePtr), - TCL_TRACE_RENAME|TCL_TRACE_DELETE, ObjectRenamedTrace, ioPtr); - } - if (iclsPtr->flags & (ITCL_WIDGETADAPTOR)) { - /* - * set all the init values for options - */ - - objPtr = Tcl_NewStringObj( - ITCL_NAMESPACE"::internal::commands::widgetinitobjectoptions ", - -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(ioPtr->varNsNamePtr), -1); - Tcl_AppendToObj(objPtr, " ", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(ioPtr->namePtr), -1); - Tcl_AppendToObj(objPtr, " ", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_IncrRefCount(objPtr); - result = Tcl_EvalObjEx(interp, objPtr, 0); - Tcl_DecrRefCount(objPtr); - if (result != TCL_OK) { - infoPtr->currIoPtr = saveCurrIoPtr; - result = TCL_ERROR; - goto errorReturn; - } - } - if (iclsPtr->flags & (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - /* FIXME have to check for hierarchy if ITCL_ECLASS !! */ - result = ItclCheckForInitializedComponents(interp, ioPtr->iclsPtr, - ioPtr); - if (result != TCL_OK) { - istate = Itcl_SaveInterpState(interp, result); - if (ioPtr->accessCmd != (Tcl_Command) NULL) { - Tcl_DeleteCommandFromToken(interp, ioPtr->accessCmd); - ioPtr->accessCmd = NULL; - } - result = Itcl_RestoreInterpState(interp, istate); - /* need this for 2 ReleaseData at errorReturn!! */ - ItclPreserveObject(ioPtr); - goto errorReturn; - } - } - - /* - * Add it to the list of all known objects. The only - * tricky thing to watch out for is the case where the - * object deleted itself inside its own constructor. - * In that case, we don't want to add the object to - * the list of valid objects. We can determine that - * the object deleted itself by checking to see if - * its accessCmd member is NULL. - */ - if (result == TCL_OK && (ioPtr->accessCmd != NULL)) { - - if (!(ioPtr->iclsPtr->flags & ITCL_CLASS)) { - result = DelegationInstall(interp, ioPtr, iclsPtr); - if (result != TCL_OK) { - goto errorReturn; - } - } - hPtr = Tcl_CreateHashEntry(&iclsPtr->infoPtr->objectCmds, - (char*)ioPtr->accessCmd, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ioPtr); - hPtr = Tcl_CreateHashEntry(&iclsPtr->infoPtr->objects, - (char*)ioPtr, &newEntry); - Tcl_SetHashValue(hPtr, (ClientData)ioPtr); - - /* - * This is an inelegant hack, left behind until the need for it - * can be eliminated by getting the inheritance tree right. - */ - - if (iclsPtr->flags - & (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - Tcl_NewInstanceMethod(interp, ioPtr->oPtr, - Tcl_NewStringObj("unknown", -1), 0, - &itclRootMethodType, ItclUnknownGuts); - } - - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - Tcl_Obj *objPtr = Tcl_NewObj(); - Tcl_GetCommandFullName(interp, ioPtr->accessCmd, objPtr); - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - /* skip over the leading :: */ - char *objName; - char *lastObjName; - lastObjName = Tcl_GetString(objPtr); - objName = lastObjName; - while (1) { - objName = strstr(objName, "::"); - if (objName == NULL) { - break; - } - objName += 2; - lastObjName = objName; - } - - Tcl_AppendResult(interp, lastObjName, NULL); - } else { - Tcl_AppendResult(interp, Tcl_GetString(objPtr), NULL); - } - Tcl_DecrRefCount(objPtr); - } - } else { - if (ioPtr->accessCmd != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->objectCmds, - (char*)ioPtr->accessCmd); - if (hPtr != NULL) { - Tcl_DeleteHashEntry(hPtr); - } - } - } - - /* - * Release the object. If it was destructed above, it will - * die at this point. - */ - /* - * At this point, the object is fully constructed. - * Destroy the "constructed" table in the object data, since - * it is no longer needed. - */ - if (infoPtr != NULL) { - infoPtr->currIoPtr = saveCurrIoPtr; - } - infoPtr->lastIoPtr = ioPtr; - Tcl_DeleteHashTable(ioPtr->constructed); - ckfree((char*)ioPtr->constructed); - ioPtr->constructed = NULL; - ItclAddObjectsDictInfo(interp, ioPtr); - ItclReleaseObject(ioPtr); - return result; - -errorReturn: - /* - * At this point, the object is not constructed as there was an error. - * Destroy the "constructed" table in the object data, since - * it is no longer needed. - */ - if (saveNsNamePtr) { - Tcl_SetVar2Ex(interp, "::itcl::internal::varNsName", name, - saveNsNamePtr, 0); - Tcl_DecrRefCount(saveNsNamePtr); - saveNsNamePtr = NULL; - } - if (infoPtr != NULL) { - infoPtr->lastIoPtr = ioPtr; - infoPtr->currIoPtr = saveCurrIoPtr; - } - if (ioPtr->constructed != NULL) { - Tcl_DeleteHashTable(ioPtr->constructed); - ckfree((char*)ioPtr->constructed); - ioPtr->constructed = NULL; - } - ItclDeleteObjectVariablesNamespace(interp, ioPtr); - ItclReleaseObject(ioPtr); - ItclReleaseObject(ioPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclInitObjectCommands() - * - * Init all instance commands. - * This is usually invoked automatically - * by Itcl_CreateObject(), when an object is created. - * ------------------------------------------------------------------------ - */ -static int -ItclInitObjectCommands( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr, - const char *name) -{ -#ifdef NEW_PROTO_RESOLVER - Tcl_HashEntry *hPtr; - Tcl_HashEntry *entry; - Tcl_HashSearch place; - Tcl_Command cmdPtr; - Tcl_Obj *objPtr; - Tcl_Namespace *nsPtr; - ItclClass *iclsPtr2; - ItclClass *lastIclsPtr; - ItclHierIter hier; - ItclMemberFunc *imPtr; - ItclCmdLookup *clookup; - ItclCmdLookup *info_clookup; - - info_clookup = NULL; - lastIclsPtr = NULL; - Tcl_ResetResult(interp); - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - entry = Tcl_FirstHashEntry(&iclsPtr2->functions, &place); - while (entry) { - imPtr = (ItclMemberFunc *)Tcl_GetHashValue(entry); - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, - (char *)imPtr->namePtr); - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - cmdPtr = imPtr->accessCmd; - nsPtr = iclsPtr->nsPtr; - if ((imPtr->flags & ITCL_COMMON) == 0) { - cmdPtr = Itcl_RegisterObjectCommand(interp, ioPtr, - Tcl_GetString(imPtr->namePtr), clookup->classCmdInfoPtr, - cmdPtr, iclsPtr->nsPtr); - } else { - cmdPtr = Itcl_RegisterObjectCommand(interp, ioPtr, - Tcl_GetString(imPtr->namePtr), clookup->classCmdInfoPtr, - cmdPtr, iclsPtr->nsPtr); - } - entry = Tcl_NextHashEntry(&place); - } - lastIclsPtr = iclsPtr2; - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - - /* add some builtin functions to every class!! */ - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - objPtr = Tcl_NewStringObj("info", -1); - hPtr = Tcl_FindHashEntry(&iclsPtr2->resolveCmds, objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - cmdPtr = Itcl_RegisterObjectCommand(interp, ioPtr, "info", - clookup->classCmdInfoPtr, cmdPtr, iclsPtr->nsPtr); - } - objPtr = Tcl_NewStringObj("isa", -1); - hPtr = Tcl_FindHashEntry(&iclsPtr2->resolveCmds, objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - cmdPtr = Itcl_RegisterObjectCommand(interp, ioPtr, "isa", - clookup->classCmdInfoPtr, cmdPtr, iclsPtr->nsPtr); - } - objPtr = Tcl_NewStringObj("setget", -1); - hPtr = Tcl_FindHashEntry(&iclsPtr2->resolveCmds, objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr != NULL) { - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - cmdPtr = Itcl_RegisterObjectCommand(interp, ioPtr, "setget", - clookup->classCmdInfoPtr, cmdPtr, iclsPtr->nsPtr); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); -#endif - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclInitObjectVariables() - * - * Init all instance variables and create the necessary variable namespaces - * for the given object instance. This is usually invoked automatically - * by Itcl_CreateObject(), when an object is created. - * ------------------------------------------------------------------------ - */ -static int -ItclInitObjectVariables( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr) -{ - Tcl_DString buffer; - Tcl_DString buffer2; - Tcl_HashEntry *hPtr; - Tcl_HashEntry *hPtr2; - Tcl_HashSearch place; - Tcl_Namespace *varNsPtr; - Tcl_Namespace *varNsPtr2; - Tcl_CallFrame frame; - Tcl_Var varPtr; - ItclClass *iclsPtr2; - ItclHierIter hier; - ItclVariable *ivPtr; - ItclComponent *icPtr; -#ifdef NEW_PROTO_RESOLVER - ItclVarLookup *vlookup; -#endif - const char *varName; - const char *inheritComponentName; - int itclOptionsIsSet; - int isNew; - - ivPtr = NULL; - /* - * create all the variables for each class in the - * ::itcl::variables::<object namespace>::<class> namespace as an - * undefined variable using the Tcl "variable xx" command - */ - itclOptionsIsSet = 0; - inheritComponentName = NULL; - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - Tcl_ResetResult(interp); - while (iclsPtr2 != NULL) { - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(ioPtr->oPtr))->fullName, -1); - Tcl_DStringAppend(&buffer, iclsPtr2->nsPtr->fullName, -1); - varNsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), - NULL, 0); - if (varNsPtr == NULL) { - varNsPtr = Tcl_CreateNamespace(interp, Tcl_DStringValue(&buffer), - NULL, 0); - } - /* now initialize the variables which have an init value */ - if (Itcl_PushCallFrame(interp, &frame, varNsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - goto errorCleanup2; - } - hPtr = Tcl_FirstHashEntry(&iclsPtr2->variables, &place); - while (hPtr) { - ivPtr = (ItclVariable*)Tcl_GetHashValue(hPtr); - varName = Tcl_GetString(ivPtr->namePtr); - if ((ivPtr->flags & ITCL_OPTIONS_VAR) && !itclOptionsIsSet) { - /* this is the special code for the "itcl_options" variable */ - itclOptionsIsSet = 1; - Tcl_DStringInit(&buffer2); - Tcl_DStringAppend(&buffer2, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(ioPtr->oPtr))->fullName, -1); - varNsPtr2 = Tcl_FindNamespace(interp, - Tcl_DStringValue(&buffer2), NULL, 0); - if (varNsPtr2 == NULL) { - varNsPtr2 = Tcl_CreateNamespace(interp, - Tcl_DStringValue(&buffer2), NULL, 0); - } - Tcl_DStringFree(&buffer2); - Itcl_PopCallFrame(interp); - /* now initialize the variables which have an init value */ - if (Itcl_PushCallFrame(interp, &frame, varNsPtr2, - /*isProcCallFrame*/0) != TCL_OK) { - goto errorCleanup2; - } - Tcl_TraceVar2(interp, "itcl_options", - NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, - ItclTraceOptionVar, (ClientData)ioPtr); - Itcl_PopCallFrame(interp); - if (Itcl_PushCallFrame(interp, &frame, varNsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - goto errorCleanup2; - } - hPtr = Tcl_NextHashEntry(&place); - continue; - } - if (ivPtr->flags & ITCL_COMPONENT_VAR) { - hPtr2 = Tcl_FindHashEntry(&ivPtr->iclsPtr->components, - (char *)ivPtr->namePtr); - if (hPtr2 == NULL) { - Tcl_AppendResult(interp, "cannot find component \"", - Tcl_GetString(ivPtr->namePtr), "\" in class \"", - Tcl_GetString(ivPtr->iclsPtr->namePtr), NULL); - goto errorCleanup; - } - icPtr = Tcl_GetHashValue(hPtr2); - if (icPtr->flags & ITCL_COMPONENT_INHERIT) { - if (inheritComponentName != NULL) { - Tcl_AppendResult(interp, "object \"", - Tcl_GetString(ioPtr->namePtr), - "\" can only have one component with inherit.", - " Had already component \"", - inheritComponentName, - "\" now component \"", - Tcl_GetString(icPtr->namePtr), "\"", NULL); - goto errorCleanup; - - } else { - inheritComponentName = Tcl_GetString(icPtr->namePtr); - } - } - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectComponents, - (char *)ivPtr->namePtr, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr2, icPtr); - } - /* this is a component variable */ - /* FIXME initialize it to the empty string */ - /* the initialization is arguable, should it be done? */ - if (Tcl_SetVar2(interp, varName, NULL, - "", TCL_NAMESPACE_ONLY) == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR cannot set", - " variable \"", varName, "\"\n", NULL); - goto errorCleanup; - } - } - hPtr2 = Tcl_FindHashEntry(&ivPtr->iclsPtr->resolveVars, varName); - if (hPtr2 == NULL) { - hPtr = Tcl_NextHashEntry(&place); - continue; - } -#ifdef NEW_PROTO_RESOLVER - vlookup = Tcl_GetHashValue(hPtr2); -#endif - if ((ivPtr->flags & ITCL_COMMON) == 0) { -#ifndef NEW_PROTO_RESOLVER - varPtr = Tcl_NewNamespaceVar(interp, varNsPtr, - Tcl_GetString(ivPtr->namePtr)); -#else - varPtr = Itcl_RegisterObjectVariable(interp, ioPtr, - Tcl_GetString(ivPtr->namePtr), vlookup->classVarInfoPtr, - NULL, varNsPtr); -#endif - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectVariables, - (char *)ivPtr, &isNew); - if (isNew) { - Itcl_PreserveVar(varPtr); - Tcl_SetHashValue(hPtr2, varPtr); - } else { - } - if (ivPtr->flags & (ITCL_THIS_VAR|ITCL_TYPE_VAR| - ITCL_SELF_VAR|ITCL_SELFNS_VAR|ITCL_WIN_VAR)) { - int isDone = 0; - if (Tcl_SetVar2(interp, varName, NULL, - "", TCL_NAMESPACE_ONLY) == NULL) { - Tcl_AppendResult(interp, "INTERNAL ERROR cannot set", - " variable \"", varNsPtr->fullName, "::", - varName, "\"\n", NULL); - goto errorCleanup; - } - if (ivPtr->flags & ITCL_THIS_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, ItclTraceThisVar, - (ClientData)ioPtr); - isDone = 1; - } - if (!isDone && ivPtr->flags & ITCL_TYPE_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, ItclTraceTypeVar, - (ClientData)ioPtr); - isDone = 1; - } - if (!isDone && ivPtr->flags & ITCL_SELF_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, ItclTraceSelfVar, - (ClientData)ioPtr); - isDone = 1; - } - if (!isDone && ivPtr->flags & ITCL_SELFNS_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, ItclTraceSelfnsVar, - (ClientData)ioPtr); - isDone = 1; - } - if (!isDone && ivPtr->flags & ITCL_WIN_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, ItclTraceWinVar, - (ClientData)ioPtr); - isDone = 1; - } - } else { - if (ivPtr->flags & ITCL_HULL_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, - ItclTraceItclHullVar, - (ClientData)ioPtr); - } else { - if (ivPtr->init != NULL) { - if (Tcl_SetVar(interp, - Tcl_GetString(ivPtr->namePtr), - Tcl_GetString(ivPtr->init), - TCL_NAMESPACE_ONLY) == NULL) { - goto errorCleanup; - } - } - if (ivPtr->arrayInitPtr != NULL) { - Tcl_DString buffer3; - int i; - int argc; - const char **argv; - const char *val; - - Tcl_DStringInit(&buffer3); - Tcl_DStringAppend(&buffer3, varNsPtr->fullName, -1); - Tcl_DStringAppend(&buffer3, "::", -1); - Tcl_DStringAppend(&buffer3, - Tcl_GetString(ivPtr->namePtr), -1); - Tcl_SplitList(interp, - Tcl_GetString(ivPtr->arrayInitPtr), - &argc, &argv); - for (i = 0; i < argc; i++) { - val = Tcl_SetVar2(interp, - Tcl_DStringValue(&buffer3), argv[i], - argv[i + 1], TCL_NAMESPACE_ONLY); - if (!val) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot initialize variable \"", - Tcl_GetString(ivPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - i++; - } - Tcl_DStringFree(&buffer3); - ckfree((char *)argv); - } - } - } - } else { - if (ivPtr->flags & ITCL_HULL_VAR) { - Tcl_TraceVar2(interp, varName, NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, - ItclTraceItclHullVar, - (ClientData)ioPtr); - } - hPtr2 = Tcl_FindHashEntry(&iclsPtr2->classCommons, - (char *)ivPtr); - if (hPtr2 == NULL) { - goto errorCleanup; - } - varPtr = Tcl_GetHashValue(hPtr2); - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectVariables, - (char *)ivPtr, &isNew); - if (isNew) { - Itcl_PreserveVar(varPtr); - Tcl_SetHashValue(hPtr2, varPtr); - } else { -#ifdef NEW_PROTO_RESOLVER - varPtr = Itcl_RegisterObjectVariable(interp, ioPtr, - Tcl_GetString(ivPtr->namePtr), - vlookup->classVarInfoPtr, - varPtr, varNsPtr); -#endif - } - if (ivPtr->flags & ITCL_COMPONENT_VAR) { - if (ivPtr->flags & ITCL_COMMON) { - Tcl_Obj *objPtr2; - objPtr2 = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, - -1); - Tcl_AppendToObj(objPtr2, (Tcl_GetObjectNamespace( - ivPtr->iclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr2, "::", -1); - Tcl_AppendToObj(objPtr2, varName, -1); - /* itcl_hull is traced in itclParse.c */ - if (strcmp(varName, "itcl_hull") == 0) { - Tcl_TraceVar2(interp, - Tcl_GetString(objPtr2), NULL, - TCL_TRACE_WRITES, ItclTraceItclHullVar, - (ClientData)ioPtr); - } else { - Tcl_TraceVar2(interp, - Tcl_GetString(objPtr2), NULL, - TCL_TRACE_WRITES, ItclTraceComponentVar, - (ClientData)ioPtr); - } - Tcl_DecrRefCount(objPtr2); - } else { - Tcl_TraceVar2(interp, - varName, NULL, - TCL_TRACE_WRITES, ItclTraceComponentVar, - (ClientData)ioPtr); - } - } - } - hPtr = Tcl_NextHashEntry(&place); - } - Itcl_PopCallFrame(interp); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Tcl_DStringFree(&buffer); - Itcl_DeleteHierIter(&hier); - return TCL_OK; -errorCleanup: - Itcl_PopCallFrame(interp); -errorCleanup2: - varNsPtr = Tcl_FindNamespace(interp, Tcl_GetString(ioPtr->varNsNamePtr), - NULL, 0); - if (varNsPtr != NULL) { - Tcl_DeleteNamespace(varNsPtr); - } - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * ItclInitObjectOptions() - * - * Collect all instance options for the given object instance to allow - * faster runtime access to the options. - * if the same option name is used in more than one class the first one - * found is used (for initializing and for the class name)!! - * # It is assumed, that an option can only exist in one class?? - * # So no duplicates allowed?? - * This is usually invoked automatically by Itcl_CreateObject(), - * when an object is created. - * ------------------------------------------------------------------------ - */ -int -ItclInitObjectOptions( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr) -{ - Tcl_DString buffer; - Tcl_HashEntry *hPtr; - Tcl_HashEntry *hPtr2; - Tcl_HashSearch place; - Tcl_CallFrame frame; - Tcl_Namespace *varNsPtr; - ItclClass *iclsPtr2; - ItclHierIter hier; - ItclOption *ioptPtr; - ItclDelegatedOption *idoPtr; - int isNew; - - ioptPtr = NULL; - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - /* now initialize the options which have an init value */ - hPtr = Tcl_FirstHashEntry(&iclsPtr2->options, &place); - while (hPtr) { - ioptPtr = (ItclOption*)Tcl_GetHashValue(hPtr); - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectOptions, - (char *)ioptPtr->namePtr, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr2, ioptPtr); - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(ioPtr->oPtr)->fullName), -1); - varNsPtr = Tcl_FindNamespace(interp, - Tcl_DStringValue(&buffer), NULL, 0); - if (varNsPtr == NULL) { - varNsPtr = Tcl_CreateNamespace(interp, - Tcl_DStringValue(&buffer), NULL, 0); - } - Tcl_DStringFree(&buffer); - /* now initialize the options which have an init value */ - if (Itcl_PushCallFrame(interp, &frame, varNsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - return TCL_ERROR; - } - if ((ioptPtr != NULL) && (ioptPtr->namePtr != NULL) && - (ioptPtr->defaultValuePtr != NULL)) { - if (Tcl_SetVar2(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), - Tcl_GetString(ioptPtr->defaultValuePtr), - TCL_NAMESPACE_ONLY) == NULL) { - Itcl_PopCallFrame(interp); - return TCL_ERROR; - } - Tcl_TraceVar2(interp, "itcl_options", - NULL, - TCL_TRACE_READS|TCL_TRACE_WRITES, - ItclTraceOptionVar, (ClientData)ioPtr); - } - Itcl_PopCallFrame(interp); - } - hPtr = Tcl_NextHashEntry(&place); - } - /* now check for options which are delegated */ - hPtr = Tcl_FirstHashEntry(&iclsPtr2->delegatedOptions, &place); - while (hPtr) { - idoPtr = (ItclDelegatedOption*)Tcl_GetHashValue(hPtr); - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectDelegatedOptions, - (char *)idoPtr->namePtr, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr2, idoPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclInitObjectMethodVariables() - * - * Collect all instance methdovariables for the given object instance to allow - * faster runtime access to the methdovariables. - * This is usually invoked automatically by Itcl_CreateObject(), - * when an object is created. - * ------------------------------------------------------------------------ - */ -int -ItclInitObjectMethodVariables( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr, - const char *name) -{ - ItclClass *iclsPtr2; - ItclHierIter hier; - ItclMethodVariable *imvPtr; - Tcl_HashEntry *hPtr; - Tcl_HashEntry *hPtr2; - Tcl_HashSearch place; - int isNew; - - imvPtr = NULL; - Itcl_InitHierIter(&hier, iclsPtr); - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - while (iclsPtr2 != NULL) { - hPtr = Tcl_FirstHashEntry(&iclsPtr2->methodVariables, &place); - while (hPtr) { - imvPtr = (ItclMethodVariable*)Tcl_GetHashValue(hPtr); - hPtr2 = Tcl_CreateHashEntry(&ioPtr->objectMethodVariables, - (char *)imvPtr->namePtr, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr2, imvPtr); - } - hPtr = Tcl_NextHashEntry(&place); - } - iclsPtr2 = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteObject() - * - * Attempts to delete an object by invoking its destructor. - * - * If the destructor is successful, then the object is deleted by - * removing its access command, and this procedure returns TCL_OK. - * Otherwise, the object will remain alive, and this procedure - * returns TCL_ERROR (along with an error message in the interpreter). - * ------------------------------------------------------------------------ - */ -int -Itcl_DeleteObject( - Tcl_Interp *interp, /* interpreter mananging object */ - ItclObject *contextIoPtr) /* object to be deleted */ -{ - Tcl_CmdInfo cmdInfo; - Tcl_HashEntry *hPtr; - - - Tcl_GetCommandInfoFromToken(contextIoPtr->accessCmd, &cmdInfo); - - contextIoPtr->flags |= ITCL_OBJECT_IS_DELETED; - ItclPreserveObject(contextIoPtr); - - /* - * Invoke the object's destructors. - */ - if (Itcl_DestructObject(interp, contextIoPtr, 0) != TCL_OK) { - ItclReleaseObject(contextIoPtr); - contextIoPtr->flags |= - ITCL_TCLOO_OBJECT_IS_DELETED|ITCL_OBJECT_DESTRUCT_ERROR; - return TCL_ERROR; - } - /* - * Remove the object from the global list. - */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->infoPtr->objects, - (char*)contextIoPtr); - - if (hPtr) { - Tcl_DeleteHashEntry(hPtr); - } - - /* - * Change the object's access command so that it can be - * safely deleted without attempting to destruct the object - * again. Then delete the access command. If this is - * the last use of the object data, the object will die here. - */ - if ((contextIoPtr->accessCmd != NULL) && (!(contextIoPtr->flags & - (ITCL_OBJECT_IS_RENAMED)))) { - if (Tcl_GetCommandInfoFromToken(contextIoPtr->accessCmd, &cmdInfo) == 1) { - cmdInfo.deleteProc = ItclReleaseObject; - Tcl_SetCommandInfoFromToken(contextIoPtr->accessCmd, &cmdInfo); - - Tcl_DeleteCommandFromToken(interp, contextIoPtr->accessCmd); - } - } - contextIoPtr->oPtr = NULL; - contextIoPtr->accessCmd = NULL; - - ItclReleaseObject(contextIoPtr); - - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclDeleteObjectVariablesNamespace() - * - * ------------------------------------------------------------------------ - */ -void -ItclDeleteObjectVariablesNamespace( - Tcl_Interp *interp, - ItclObject *ioPtr) -{ - Tcl_Namespace *varNsPtr; - - if (ioPtr->callRefCount < 1) { - /* free the object's variables namespace and variables in it */ - ioPtr->flags &= ~ITCL_OBJECT_SHOULD_VARNS_DELETE; - varNsPtr = Tcl_FindNamespace(interp, Tcl_GetString(ioPtr->varNsNamePtr), - NULL, 0); - if (varNsPtr != NULL) { - Tcl_DeleteNamespace(varNsPtr); - } - } else { - ioPtr->flags |= ITCL_OBJECT_SHOULD_VARNS_DELETE; - } -} - -static int -FinalizeDeleteObject( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ItclObject *contextIoPtr = data[0]; - if (result == TCL_OK) { - ItclDeleteObjectVariablesNamespace(interp, contextIoPtr); - Tcl_ResetResult(interp); - } - - Tcl_DeleteHashTable(contextIoPtr->destructed); - ckfree((char*)contextIoPtr->destructed); - contextIoPtr->destructed = NULL; - return result; -} - -static int -CallDestructBase( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Obj *objPtr; - ItclObject *contextIoPtr = data[0]; - int flags = PTR2INT(data[1]); - - if (result != TCL_OK) { - return result; - } - result = ItclDestructBase(interp, contextIoPtr, contextIoPtr->iclsPtr, - flags); - if (result != TCL_OK) { - return result; - } - /* destroy the hull */ - if (contextIoPtr->hullWindowNamePtr != NULL) { - objPtr = Tcl_NewStringObj("destroy ", -1); - Tcl_AppendToObj(objPtr, - Tcl_GetString(contextIoPtr->hullWindowNamePtr), -1); - result = Tcl_EvalObjEx(interp, objPtr, 0); - } - return result; -} -/* - * ------------------------------------------------------------------------ - * Itcl_DestructObject() - * - * Invokes the destructor for a particular object. Usually invoked - * by Itcl_DeleteObject() or Itcl_DestroyObject() as a part of the - * object destruction process. If the ITCL_IGNORE_ERRS flag is - * included, all destructors are invoked even if errors are - * encountered, and the result will always be TCL_OK. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error - * message in the interpreter) if anything goes wrong. - * ------------------------------------------------------------------------ - */ -int -Itcl_DestructObject( - Tcl_Interp *interp, /* interpreter mananging new object */ - ItclObject *contextIoPtr, /* object to be destructed */ - int flags) /* flags: ITCL_IGNORE_ERRS */ -{ - int result; - - if ((contextIoPtr->flags & (ITCL_OBJECT_IS_DESTRUCTED))) { - return TCL_OK; - } - contextIoPtr->flags |= ITCL_OBJECT_IS_DESTRUCTED; - /* - * If there is a "destructed" table, then this object is already - * being destructed. Flag an error, unless errors are being - * ignored. - */ - if (contextIoPtr->destructed) { - if ((flags & ITCL_IGNORE_ERRS) == 0) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "can't delete an object while it is being destructed", - (char*)NULL); - return TCL_ERROR; - } - return TCL_OK; - } - - result = TCL_OK; - if (contextIoPtr->oPtr != NULL) { - void *callbackPtr; - /* - * Create a "destructed" table to keep track of which destructors - * have been invoked. This is used in ItclDestructBase to make - * sure that all base class destructors have been called, - * explicitly or implicitly. - */ - contextIoPtr->destructed = (Tcl_HashTable*)ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitObjHashTable(contextIoPtr->destructed); - - /* - * Destruct the object starting from the most-specific class. - * If all goes well, return the null string as the result. - */ - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - Tcl_NRAddCallback(interp, FinalizeDeleteObject, contextIoPtr, - NULL, NULL, NULL); - Tcl_NRAddCallback(interp, CallDestructBase, contextIoPtr, - INT2PTR(flags), NULL, NULL); - result = Itcl_NRRunCallbacks(interp, callbackPtr); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclDestructBase() - * - * Invoked by Itcl_DestructObject() to recursively destruct an object - * from the specified class level. Finds and invokes the destructor - * for the specified class, and then recursively destructs all base - * classes. If the ITCL_IGNORE_ERRS flag is included, all destructors - * are invoked even if errors are encountered, and the result will - * always be TCL_OK. - * - * Returns TCL_OK on success, or TCL_ERROR (along with an error message - * in interp->result) on error. - * ------------------------------------------------------------------------ - */ -static int -ItclDestructBase( - Tcl_Interp *interp, /* interpreter */ - ItclObject *contextIoPtr, /* object being destructed */ - ItclClass *contextIclsPtr, /* current class being destructed */ - int flags) /* flags: ITCL_IGNORE_ERRS */ -{ - int result; - Itcl_ListElem *elem; - ItclClass *iclsPtr; - - if (contextIoPtr->flags & ITCL_OBJECT_CLASS_DESTRUCTED) { - return TCL_OK; - } - /* - * Look for a destructor in this class, and if found, - * invoke it. - */ - if (Tcl_FindHashEntry(contextIoPtr->destructed, - (char *)contextIclsPtr->namePtr) == NULL) { - result = Itcl_InvokeMethodIfExists(interp, "destructor", - contextIclsPtr, contextIoPtr, 0, (Tcl_Obj* const*)NULL); - if (result != TCL_OK) { - return TCL_ERROR; - } - } - - /* - * Scan through the list of base classes recursively and destruct - * them. Traverse the list in normal order, so that we destruct - * from most- to least-specific. - */ - elem = Itcl_FirstListElem(&contextIclsPtr->bases); - while (elem) { - iclsPtr = (ItclClass*)Itcl_GetListValue(elem); - - if (ItclDestructBase(interp, contextIoPtr, iclsPtr, flags) != TCL_OK) { - return TCL_ERROR; - } - elem = Itcl_NextListElem(elem); - } - - /* - * Throw away any result from the destructors and return. - */ - Tcl_ResetResult(interp); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_FindObject() - * - * Searches for an object with the specified name, which have - * namespace scope qualifiers like "namesp::namesp::name", or may - * be a scoped value such as "namespace inscope ::foo obj". - * - * If an error is encountered, this procedure returns TCL_ERROR - * along with an error message in the interpreter. Otherwise, it - * returns TCL_OK. If an object was found, "roPtr" returns a - * pointer to the object data. Otherwise, it returns NULL. - * ------------------------------------------------------------------------ - */ -int -Itcl_FindObject( - Tcl_Interp *interp, /* interpreter containing this object */ - const char *name, /* name of the object */ - ItclObject **roPtr) /* returns: object data or NULL */ -{ - Tcl_Command cmd; - Tcl_CmdInfo cmdInfo; - Tcl_Namespace *contextNs; - char *cmdName; - - contextNs = NULL; - cmdName = NULL; - /* - * The object name may be a scoped value of the form - * "namespace inscope <namesp> <command>". If it is, - * decode it. - */ - if (Itcl_DecodeScopedCommand(interp, name, &contextNs, &cmdName) - != TCL_OK) { - return TCL_ERROR; - } - - /* - * Look for the object's access command, and see if it has - * the appropriate command handler. - */ - cmd = Tcl_FindCommand(interp, cmdName, contextNs, /* flags */ 0); - if (cmd != NULL && Itcl_IsObject(cmd)) { - if (Tcl_GetCommandInfoFromToken(cmd, &cmdInfo) != 1) { - *roPtr = NULL; - } - *roPtr = cmdInfo.deleteData; - } else { - *roPtr = NULL; - } - - ckfree(cmdName); - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsObject() - * - * Checks the given Tcl command to see if it represents an itcl object. - * Returns non-zero if the command is associated with an object. - * ------------------------------------------------------------------------ - */ -int -Itcl_IsObject( - Tcl_Command cmd) /* command being tested */ -{ - Tcl_CmdInfo cmdInfo; - - if (Tcl_GetCommandInfoFromToken(cmd, &cmdInfo) != 1) { - return 0; - } - - if ((void *)cmdInfo.deleteProc == (void *)ItclDestroyObject) { - return 1; - } - - /* - * This may be an imported command. Try to get the real - * command and see if it represents an object. - */ - cmd = Tcl_GetOriginalCommand(cmd); - if (cmd != NULL) { - if (Tcl_GetCommandInfoFromToken(cmd, &cmdInfo) != 1) { - return 0; - } - - if ((void *)cmdInfo.deleteProc == (void *)ItclDestroyObject) { - return 1; - } - } - return 0; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ObjectIsa() - * - * Checks to see if an object belongs to the given class. An object - * "is-a" member of the class if the class appears anywhere in its - * inheritance hierarchy. Returns non-zero if the object belongs to - * the class, and zero otherwise. - * ------------------------------------------------------------------------ - */ -int -Itcl_ObjectIsa( - ItclObject *contextIoPtr, /* object being tested */ - ItclClass *iclsPtr) /* class to test for "is-a" relationship */ -{ - Tcl_HashEntry *entry; - - if (contextIoPtr == NULL) { - return 0; - } - entry = Tcl_FindHashEntry(&contextIoPtr->iclsPtr->heritage, (char*)iclsPtr); - return (entry != NULL); -} - -/* - * ------------------------------------------------------------------------ - * ItclGetInstanceVar() - * - * Returns the current value for an object data member. The member - * name is interpreted with respect to the given class scope, which - * is usually the most-specific class for the object. - * - * If successful, this procedure returns a pointer to a string value - * which remains alive until the variable changes it value. If - * anything goes wrong, this returns NULL. - * ------------------------------------------------------------------------ - */ -const char* -ItclGetInstanceVar( - Tcl_Interp *interp, /* current interpreter */ - const char *name1, /* name of desired instance variable */ - const char *name2, /* array element or NULL */ - ItclObject *contextIoPtr, /* current object */ - ItclClass *contextIclsPtr) /* name is interpreted in this scope */ -{ - Tcl_HashEntry *hPtr; - Tcl_CallFrame frame; - Tcl_CallFrame *framePtr; - Tcl_Namespace *nsPtr; - Tcl_DString buffer; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - ItclVarLookup *vlookup; - const char *val; - int isItclOptions; - int doAppend; - - /* - * Make sure that the current namespace context includes an - * object that is being manipulated. - */ - if (contextIoPtr == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot access object-specific info without an object context", - (char*)NULL); - return NULL; - } - - /* get the variable definition to check if that is an ITCL_COMMON */ - if (contextIclsPtr == NULL) { - iclsPtr = contextIoPtr->iclsPtr; - } else { - iclsPtr = contextIclsPtr; - } - ivPtr = NULL; - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, (char *)name1); - if (hPtr != NULL) { - vlookup = Tcl_GetHashValue(hPtr); - ivPtr = vlookup->ivPtr; - /* - * Install the object context and access the data member - * like any other variable. - */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectVariables, (char *)ivPtr); - if (hPtr) { - Tcl_Obj *varName = Tcl_NewObj(); - Tcl_Var varPtr = Tcl_GetHashValue(hPtr); - Tcl_GetVariableFullName(interp, varPtr, varName); - - val = Tcl_GetVar2(interp, Tcl_GetString(varName), name2, - TCL_LEAVE_ERR_MSG); - Tcl_DecrRefCount(varName); - if (val) { - return val; - } - } - } - - isItclOptions = 0; - if (strcmp(name1, "itcl_options") == 0) { - isItclOptions = 1; - } - if (strcmp(name1, "itcl_option_components") == 0) { - isItclOptions = 1; - } - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, Tcl_GetString(contextIoPtr->varNsNamePtr), -1); - doAppend = 1; - if ((contextIclsPtr == NULL) || (contextIclsPtr->flags & - (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - if (isItclOptions) { - doAppend = 0; - } - } - if ((ivPtr != NULL) && (ivPtr->flags & ITCL_COMMON)) { - if (!isItclOptions) { - Tcl_DStringSetLength(&buffer, 0); - if (ivPtr->protection != ITCL_PUBLIC) { - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - } - doAppend = 1; - } - } - if (doAppend) { - Tcl_DStringAppend(&buffer, (Tcl_GetObjectNamespace( - contextIclsPtr->oPtr))->fullName, -1); - } - nsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - val = NULL; - if (nsPtr != NULL) { - framePtr = &frame; - Itcl_PushCallFrame(interp, framePtr, nsPtr, /*isProcCallFrame*/0); - val = Tcl_GetVar2(interp, (const char *)name1, (char*)name2, - TCL_LEAVE_ERR_MSG); - Itcl_PopCallFrame(interp); - } - - return val; -} - -/* - * ------------------------------------------------------------------------ - * ItclGetCommonInstanceVar() - * - * Returns the current value for an object data member. The member - * name is interpreted with respect to the given class scope, which - * is usually the most-specific class for the object. - * - * If successful, this procedure returns a pointer to a string value - * which remains alive until the variable changes it value. If - * anything goes wrong, this returns NULL. - * ------------------------------------------------------------------------ - */ -const char* -ItclGetCommonInstanceVar( - Tcl_Interp *interp, /* current interpreter */ - const char *name1, /* name of desired instance variable */ - const char *name2, /* array element or NULL */ - ItclObject *contextIoPtr, /* current object */ - ItclClass *contextIclsPtr) /* name is interpreted in this scope */ -{ - Tcl_CallFrame frame; - Tcl_CallFrame *framePtr; - Tcl_Namespace *nsPtr; - Tcl_DString buffer; - const char *val; - int doAppend; - - /* - * Make sure that the current namespace context includes an - * object that is being manipulated. - */ - if (contextIoPtr == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot access object-specific info without an object context", - (char*)NULL); - return NULL; - } - - /* - * Install the object context and access the data member - * like any other variable. - */ - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - doAppend = 1; - if ((contextIclsPtr == NULL) || (contextIclsPtr->flags & - (ITCL_ECLASS|ITCL_TYPE|ITCL_WIDGETADAPTOR))) { - if (strcmp(name1, "itcl_options") == 0) { - doAppend = 0; - } - if (strcmp(name1, "itcl_option_components") == 0) { - doAppend = 0; - } - } - if (doAppend) { - Tcl_DStringAppend(&buffer, (Tcl_GetObjectNamespace( - contextIclsPtr->oPtr))->fullName, -1); - } - nsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - val = NULL; - if (nsPtr != NULL) { - framePtr = &frame; - Itcl_PushCallFrame(interp, framePtr, nsPtr, /*isProcCallFrame*/0); - val = Tcl_GetVar2(interp, (const char *)name1, (char*)name2, - TCL_LEAVE_ERR_MSG); - Itcl_PopCallFrame(interp); - } - - return val; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_GetInstanceVar() - * - * Returns the current value for an object data member. The member - * name is interpreted with respect to the given class scope, which - * is usually the most-specific class for the object. - * - * If successful, this procedure returns a pointer to a string value - * which remains alive until the variable changes it value. If - * anything goes wrong, this returns NULL. - * ------------------------------------------------------------------------ - */ -const char* -Itcl_GetInstanceVar( - Tcl_Interp *interp, /* current interpreter */ - const char *name, /* name of desired instance variable */ - ItclObject *contextIoPtr, /* current object */ - ItclClass *contextIclsPtr) /* name is interpreted in this scope */ -{ - return ItclGetInstanceVar(interp, name, NULL, contextIoPtr, - contextIclsPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclSetInstanceVar() - * - * Sets the current value for an object data member. The member - * name is interpreted with respect to the given class scope, which - * is usually the most-specific class for the object. - * - * If successful, this procedure returns a pointer to a string value - * which remains alive until the variable changes it value. If - * anything goes wrong, this returns NULL. - * ------------------------------------------------------------------------ - */ -const char* -ItclSetInstanceVar( - Tcl_Interp *interp, /* current interpreter */ - const char *name1, /* name of desired instance variable */ - const char *name2, /* array member or NULL */ - const char *value, /* the value to set */ - ItclObject *contextIoPtr, /* current object */ - ItclClass *contextIclsPtr) /* name is interpreted in this scope */ -{ - Tcl_HashEntry *hPtr; - Tcl_CallFrame frame; - Tcl_CallFrame *framePtr; - Tcl_Namespace *nsPtr; - Tcl_DString buffer; - ItclVariable *ivPtr; - ItclVarLookup *vlookup; - ItclClass *iclsPtr; - const char *val; - int isItclOptions; - int doAppend; - - ivPtr = NULL; - /* - * Make sure that the current namespace context includes an - * object that is being manipulated. - */ - if (contextIoPtr == NULL) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot access object-specific info without an object context", - (char*)NULL); - return NULL; - } - /* get the variable definition to check if that is an ITCL_COMMON */ - if (contextIclsPtr == NULL) { - iclsPtr = contextIoPtr->iclsPtr; - } else { - iclsPtr = contextIclsPtr; - } - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, (char *)name1); - if (hPtr != NULL) { - vlookup = Tcl_GetHashValue(hPtr); - ivPtr = vlookup->ivPtr; - } else { - return NULL; - } - /* - * Install the object context and access the data member - * like any other variable. - */ - - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectVariables, (char *)ivPtr); - if (hPtr) { - Tcl_Obj *varName = Tcl_NewObj(); - Tcl_Var varPtr = Tcl_GetHashValue(hPtr); - Tcl_GetVariableFullName(interp, varPtr, varName); - - val = Tcl_SetVar2(interp, Tcl_GetString(varName), name2, value, - TCL_LEAVE_ERR_MSG); - Tcl_DecrRefCount(varName); - return val; - } - - isItclOptions = 0; - if (strcmp(name1, "itcl_options") == 0) { - isItclOptions = 1; - } - if (strcmp(name1, "itcl_option_components") == 0) { - isItclOptions = 1; - } - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, Tcl_GetString(contextIoPtr->varNsNamePtr), -1); - doAppend = 1; - if ((contextIclsPtr == NULL) || - (contextIclsPtr->flags & (ITCL_ECLASS|ITCL_TYPE| - ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - if (isItclOptions) { - doAppend = 0; - } - } - if (ivPtr->flags & ITCL_COMMON) { - if (!isItclOptions) { - Tcl_DStringSetLength(&buffer, 0); - if (ivPtr->protection != ITCL_PUBLIC) { - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - } - doAppend = 1; - } - } - if (doAppend) { - Tcl_DStringAppend(&buffer, (Tcl_GetObjectNamespace( - contextIclsPtr->oPtr))->fullName, -1); - } - nsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - val = NULL; - if (nsPtr != NULL) { - framePtr = &frame; - Itcl_PushCallFrame(interp, framePtr, nsPtr, /*isProcCallFrame*/0); - val = Tcl_SetVar2(interp, (const char *)name1, (char*)name2, - value, TCL_LEAVE_ERR_MSG); - Itcl_PopCallFrame(interp); - } - - return val; -} - -/* - * ------------------------------------------------------------------------ - * ItclReportObjectUsage() - * - * Appends information to the given interp summarizing the usage - * for all of the methods available for this object. Useful when - * reporting errors in Itcl_HandleInstance(). - * ------------------------------------------------------------------------ - */ -void -ItclReportObjectUsage( - Tcl_Interp *interp, /* current interpreter */ - ItclObject *contextIoPtr, /* current object */ - Tcl_Namespace *callerNsPtr, - Tcl_Namespace *contextNsPtr) /* the context namespace */ -{ - Tcl_Obj *namePtr; - Tcl_HashEntry *entry; - Tcl_HashSearch place; - Tcl_Obj *resultPtr; - ItclClass *iclsPtr = NULL; - Itcl_List cmdList; - Itcl_ListElem *elem; - ItclMemberFunc *imPtr; - ItclMemberFunc *cmpFunc; - ItclCmdLookup *clookup; - ItclObjectInfo * infoPtr = NULL; - char *name; - int ignore; - int cmp; - - if (contextIoPtr == NULL) { - resultPtr = Tcl_GetObjResult(interp); - infoPtr = (ClientData)Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - if (infoPtr == NULL) { - Tcl_AppendResult(interp, " PANIC cannot get Itcl AssocData in ItclReportObjectUsage", NULL); - return; - } - if (contextNsPtr == NULL) { - Tcl_AppendResult(interp, " PANIC cannot get contextNsPtr in ItclReportObjectUsage", NULL); - return; - } - - entry = Tcl_FindHashEntry(&infoPtr->namespaceClasses, - (char *)contextNsPtr); - if (entry) { - iclsPtr = Tcl_GetHashValue(entry); - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, " PANIC cannot get class from contextNsPtr ItclReportObjectUsage", NULL); - return; - } - } else { - iclsPtr = (ItclClass*)contextIoPtr->iclsPtr; - } - ignore = ITCL_CONSTRUCTOR | ITCL_DESTRUCTOR | ITCL_COMMON; - /* - * Scan through all methods in the virtual table and sort - * them in alphabetical order. Report only the methods - * that have simple names (no ::'s) and are accessible. - */ - Itcl_InitList(&cmdList); - entry = Tcl_FirstHashEntry(&iclsPtr->resolveCmds, &place); - while (entry) { - namePtr = (Tcl_Obj *)Tcl_GetHashKey(&iclsPtr->resolveCmds, entry); - name = Tcl_GetString(namePtr); - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - imPtr = clookup->imPtr; - - if (strstr(name,"::") || (imPtr->flags & ignore) != 0) { - imPtr = NULL; - } else { - if (imPtr->protection != ITCL_PUBLIC) { - if (contextNsPtr != NULL) { - if (!Itcl_CanAccessFunc(imPtr, contextNsPtr)) { - imPtr = NULL; - } - } - } - } - if ((imPtr != NULL) && (imPtr->codePtr != NULL)) { - if (imPtr->codePtr->flags & ITCL_BUILTIN) { - char *body; - if (imPtr->codePtr != NULL) { - body = Tcl_GetString(imPtr->codePtr->bodyPtr); - if (*body == '@') { - if (strcmp(body, "@itcl-builtin-setget") == 0) { - if (!(imPtr->iclsPtr->flags & ITCL_ECLASS)) { - imPtr = NULL; - } - } - if (strcmp(body, "@itcl-builtin-installcomponent") - == 0) { - if (!(imPtr->iclsPtr->flags & - (ITCL_WIDGET|ITCL_WIDGETADAPTOR))) { - imPtr = NULL; - } - } - } - } - } - } - - if (imPtr) { - elem = Itcl_FirstListElem(&cmdList); - while (elem) { - cmpFunc = (ItclMemberFunc*)Itcl_GetListValue(elem); - cmp = strcmp(Tcl_GetString(imPtr->namePtr), - Tcl_GetString(cmpFunc->namePtr)); - if (cmp < 0) { - Itcl_InsertListElem(elem, (ClientData)imPtr); - imPtr = NULL; - break; - } else { - if (cmp == 0) { - imPtr = NULL; - break; - } - } - elem = Itcl_NextListElem(elem); - } - if (imPtr) { - Itcl_AppendList(&cmdList, (ClientData)imPtr); - } - } - entry = Tcl_NextHashEntry(&place); - } - - /* - * Add a series of statements showing usage info. - */ - resultPtr = Tcl_GetObjResult(interp); - elem = Itcl_FirstListElem(&cmdList); - while (elem) { - imPtr = (ItclMemberFunc*)Itcl_GetListValue(elem); - Tcl_AppendToObj(resultPtr, "\n ", -1); - Itcl_GetMemberFuncUsage(imPtr, contextIoPtr, resultPtr); - - elem = Itcl_NextListElem(elem); - } - Itcl_DeleteList(&cmdList); -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceThisVar() - * - * Invoked to handle read/write traces on the "this" variable built - * into each object. - * - * On read, this procedure updates the "this" variable to contain the - * current object name. This is done dynamically, since an object's - * identity can change if its access command is renamed. - * - * On write, this procedure returns an error string, warning that - * the "this" variable cannot be set. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceThisVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_Obj *objPtr; - const char *objName; - - /* because of SF bug #187 use a different trace handler for "this", "win", "type" - * *self" and "selfns" - */ - - /* - * Handle read traces on "this" - */ - if ((flags & TCL_TRACE_READS) != 0) { - objPtr = Tcl_NewStringObj("", -1); - if (contextIoPtr->accessCmd) { - Tcl_GetCommandFullName(contextIoPtr->iclsPtr->interp, - contextIoPtr->accessCmd, objPtr); - } - objName = Tcl_GetString(objPtr); - Tcl_SetVar(interp, (const char *)name1, objName, 0); - - Tcl_DecrRefCount(objPtr); - return NULL; - } - - /* - * Handle write traces on "this" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return "variable \"this\" cannot be modified"; - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceWinVar() - * - * Invoked to handle read/write traces on the "win" variable built - * into each object. - * - * On read, this procedure updates the "win" variable to contain the - * current object name. This is done dynamically, since an object's - * identity can change if its access command is renamed. - * - * On write, this procedure returns an error string, warning that - * the "win" variable cannot be set. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceWinVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_DString buffer; - Tcl_Obj *objPtr; - const char *objName; - const char *head; - const char *tail; - - /* - * Handle read traces on "win" - */ - if ((flags & TCL_TRACE_READS) != 0) { - objPtr = Tcl_NewStringObj("", -1); - /* a window path name must not contain namespace parts !! */ - Itcl_ParseNamespPath(Tcl_GetString(contextIoPtr->origNamePtr), &buffer, &head, &tail); - if (tail == NULL) { - return " INTERNAL ERROR tail == NULL in ItclTraceThisVar for win"; - } - Tcl_SetStringObj(objPtr, tail, -1); - objName = Tcl_GetString(objPtr); - Tcl_SetVar(interp, (const char *)name1, objName, 0); - - Tcl_DecrRefCount(objPtr); - return NULL; - } - - /* - * Handle write traces on "win" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - if (!(contextIoPtr->iclsPtr->flags & ITCL_ECLASS)) { - return "variable \"win\" cannot be modified"; - } - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceTypeVar() - * - * Invoked to handle read/write traces on the "type" variable built - * into each object. - * - * On read, this procedure updates the "type" variable to contain the - * current object name. This is done dynamically, since an object's - * identity can change if its access command is renamed. - * - * On write, this procedure returns an error string, warning that - * the "type" variable cannot be set. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceTypeVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_Obj *objPtr; - const char *objName; - - /* - * Handle read traces on "type" - */ - if ((flags & TCL_TRACE_READS) != 0) { - objPtr = Tcl_NewStringObj("", -1); - Tcl_SetStringObj(objPtr, - Tcl_GetCurrentNamespace(contextIoPtr->iclsPtr->interp)->fullName, -1); - objName = Tcl_GetString(objPtr); - Tcl_SetVar(interp, (const char *)name1, objName, 0); - - Tcl_DecrRefCount(objPtr); - return NULL; - } - - /* - * Handle write traces on "type" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return "variable \"type\" cannot be modified"; - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceSelfVar() - * - * Invoked to handle read/write traces on the "self" variable built - * into each object. - * - * On read, this procedure updates the "self" variable to contain the - * current object name. This is done dynamically, since an object's - * identity can change if its access command is renamed. - * - * On write, this procedure returns an error string, warning that - * the "self" variable cannot be set. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceSelfVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_Obj *objPtr; - const char *objName; - - /* - * Handle read traces on "self" - */ - if ((flags & TCL_TRACE_READS) != 0) { - objPtr = Tcl_NewStringObj("", -1); - if (contextIoPtr->iclsPtr->flags & - (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - const char *objectName; - - objectName = ItclGetInstanceVar( - contextIoPtr->iclsPtr->interp, - "itcl_hull", NULL, contextIoPtr, - contextIoPtr->iclsPtr); - if (strlen(objectName) == 0) { - objPtr = contextIoPtr->namePtr; - Tcl_IncrRefCount(objPtr); - } else { - Tcl_SetStringObj(objPtr, objectName, -1); - } - } else { - Tcl_GetCommandFullName(contextIoPtr->iclsPtr->interp, - contextIoPtr->accessCmd, objPtr); - } - objName = Tcl_GetString(objPtr); - Tcl_SetVar(interp, (const char *)name1, objName, 0); - - Tcl_DecrRefCount(objPtr); - return NULL; - } - - /* - * Handle write traces on "self" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return "variable \"self\" cannot be modified"; - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceSelfnsVar() - * - * Invoked to handle read/write traces on the "selfns" variable built - * into each object. - * - * On read, this procedure updates the "selfns" variable to contain the - * current object name. This is done dynamically, since an object's - * identity can change if its access command is renamed. - * - * On write, this procedure returns an error string, warning that - * the "selfns" variable cannot be set. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceSelfnsVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_Obj *objPtr; - const char *objName; - - /* - * Handle read traces on "selfns" - */ - if ((flags & TCL_TRACE_READS) != 0) { - objPtr = Tcl_NewStringObj("", -1); - Tcl_SetStringObj(objPtr, Tcl_GetString(contextIoPtr->varNsNamePtr), -1); - Tcl_AppendToObj(objPtr, - Tcl_GetString(contextIoPtr->iclsPtr->fullNamePtr), -1); - objName = Tcl_GetString(objPtr); - Tcl_SetVar(interp, (const char *)name1, objName, 0); - - Tcl_DecrRefCount(objPtr); - return NULL; - } - - /* - * Handle write traces on "selfns" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return "variable \"selfns\" cannot be modified"; - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceOptionVar() - * - * Invoked to handle read/write traces on "option" variables - * - * On read, this procedure checks if there is a cgetMethodPtr and calls it - * On write, this procedure checks if there is a configureMethodPtr - * or validateMethodPtr and calls it - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceOptionVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - ItclObject *ioPtr; - ItclOption *ioptPtr; - -/* FIXME !!! */ -/* don't know yet if ItclTraceOptionVar is really needed !! */ -/* FIXME should free memory on unset or rename!! */ - if (cdata != NULL) { - ioPtr = (ItclObject*)cdata; - if (ioPtr == NULL) { - } - } else { - ioptPtr = (ItclOption*)cdata; - if (ioptPtr == NULL) { - } - /* - * Handle read traces "itcl_options" - */ - if ((flags & TCL_TRACE_READS) != 0) { - return NULL; - } - - /* - * Handle write traces "itcl_options" - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return NULL; - } - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclTraceComponentVar() - * - * Invoked to handle read/write traces on "component" variables - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceComponentVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Obj *objPtr; - Tcl_Obj *namePtr; - Tcl_Obj *componentValuePtr; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclComponent *icPtr; - ItclDelegatedFunction *idmPtr; - const char *val; - -/* FIXME should free memory on unset or rename!! */ - if (cdata != NULL) { - ioPtr = (ItclObject*)cdata; - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->objects, (char *)ioPtr); - if (hPtr == NULL) { - /* object does no longer exist or is being destructed */ - return NULL; - } - objPtr = Tcl_NewStringObj(name1, -1); - hPtr = Tcl_FindHashEntry(&ioPtr->objectComponents, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - - /* - * Handle write traces - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - if (ioPtr->noComponentTrace) { - return NULL; - } - /* need to redo the delegation for this component !! */ - if (hPtr == NULL) { - return " INTERNAL ERROR cannot get component to write to"; - } - icPtr = Tcl_GetHashValue(hPtr); - val = ItclGetInstanceVar(interp, name1, NULL, ioPtr, - ioPtr->iclsPtr); - if ((val == NULL) || (strlen(val) == 0)) { - return " INTERNAL ERROR cannot get value for component"; - } - componentValuePtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(componentValuePtr); - namePtr = Tcl_NewStringObj(name1, -1); - FOREACH_HASH_VALUE(idmPtr, &ioPtr->iclsPtr->delegatedFunctions) { - if (idmPtr->icPtr == icPtr) { - hPtr2 = Tcl_FindHashEntry(&idmPtr->exceptions, - (char *)namePtr); - if (hPtr2 == NULL) { - DelegateFunction(interp, ioPtr, ioPtr->iclsPtr, - componentValuePtr, idmPtr); - } - } - } - Tcl_DecrRefCount(componentValuePtr); - Tcl_DecrRefCount(namePtr); - return NULL; - } - /* - * Handle read traces - */ - if ((flags & TCL_TRACE_READS) != 0) { - } - - } else { - icPtr = (ItclComponent *)cdata; - /* - * Handle read traces - */ - if ((flags & TCL_TRACE_READS) != 0) { - return NULL; - } - - /* - * Handle write traces - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return NULL; - } - } - return NULL; -} -/* - * ------------------------------------------------------------------------ - * ItclTraceItclHullVar() - * - * Invoked to handle read/write traces on "itcl_hull" variables - * - * On write, this procedure returns an error as "itcl_hull" may not be modfied - * after the first initialization - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static char* -ItclTraceItclHullVar( - ClientData cdata, /* object instance data */ - Tcl_Interp *interp, /* interpreter managing this variable */ - const char *name1, /* variable name */ - const char *name2, /* unused */ - int flags) /* flags indicating read/write */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - ItclObjectInfo *infoPtr; - ItclObject *ioPtr; - ItclVariable *ivPtr; - -/* FIXME !!! */ -/* FIXME should free memory on unset or rename!! */ - if (cdata != NULL) { - ioPtr = (ItclObject*)cdata; - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->objects, (char *)ioPtr); - if (hPtr == NULL) { - /* object does no longer exist or is being destructed */ - return NULL; - } - objPtr = Tcl_NewStringObj(name1, -1); - hPtr = Tcl_FindHashEntry(&ioPtr->iclsPtr->variables, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr == NULL) { - return "INTERNAL ERROR cannot find itcl_hull variable in class definition!!"; - } - ivPtr = Tcl_GetHashValue(hPtr); - /* - * Handle write traces - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - if (ivPtr->initted == 0) { - ivPtr->initted = 1; - return NULL; - } else { - return "The itcl_hull component cannot be redefined"; - } - } - - } else { - ivPtr = (ItclVariable *)cdata; - /* - * Handle read traces - */ - if ((flags & TCL_TRACE_READS) != 0) { - return NULL; - } - - /* - * Handle write traces - */ - if ((flags & TCL_TRACE_WRITES) != 0) { - return NULL; - } - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * ItclDestroyObject() - * - * Invoked when the object access command is deleted to implicitly - * destroy the object. Invokes the object's destructors, ignoring - * any errors encountered along the way. Removes the object from - * the list of all known objects and releases the access command's - * claim to the object data. - * - * Note that the usual way to delete an object is via Itcl_DeleteObject(). - * This procedure is provided as a back-up, to handle the case when - * an object is deleted by removing its access command. - * ------------------------------------------------------------------------ - */ -static void -ItclDestroyObject( - ClientData cdata) /* object instance data */ -{ - ItclObject *contextIoPtr = (ItclObject*)cdata; - Tcl_HashEntry *hPtr; - Itcl_InterpState istate; - - if (contextIoPtr->flags & ITCL_OBJECT_IS_DESTROYED) { - return; - } - contextIoPtr->flags |= ITCL_OBJECT_IS_DESTROYED; - - if (!(contextIoPtr->flags & ITCL_OBJECT_IS_DESTRUCTED)) { - /* - * Attempt to destruct the object, but ignore any errors. - */ - istate = Itcl_SaveInterpState(contextIoPtr->interp, 0); - Itcl_DestructObject(contextIoPtr->interp, contextIoPtr, - ITCL_IGNORE_ERRS); - Itcl_RestoreInterpState(contextIoPtr->interp, istate); - } - - /* - * Now, remove the object from the global object list. - * We're careful to do this here, after calling the destructors. - * Once the access command is nulled out, the "this" variable - * won't work properly. - */ - if (contextIoPtr->accessCmd != NULL) { - hPtr = Tcl_FindHashEntry(&contextIoPtr->infoPtr->objects, - (char*)contextIoPtr); - - if (hPtr) { - Tcl_DeleteHashEntry(hPtr); - } - contextIoPtr->accessCmd = NULL; - } - ItclReleaseObject(contextIoPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclFreeObject() - * - * Deletes all instance variables and frees all memory associated with - * the given object instance. This is usually invoked automatically - * by ItclReleaseObject(), when an object's data is no longer being used. - * ------------------------------------------------------------------------ - */ -static void -ItclFreeObject( - char * cdata) /* object instance data */ -{ - FOREACH_HASH_DECLS; - Tcl_HashSearch place; - ItclCallContext *callContextPtr; - ItclObject *ioPtr; - Tcl_Var var; - - ioPtr = (ItclObject*)cdata; - - /* - * Install the class namespace and object context so that - * the object's data members can be destroyed via simple - * "unset" commands. This makes sure that traces work properly - * and all memory gets cleaned up. - * - * NOTE: Be careful to save and restore the interpreter state. - * Data can get freed in the middle of any operation, and - * we can't affort to clobber the interpreter with any errors - * from below. - */ - - ItclReleaseClass(ioPtr->iclsPtr); - if (ioPtr->constructed) { - Tcl_DeleteHashTable(ioPtr->constructed); - ckfree((char*)ioPtr->constructed); - } - if (ioPtr->destructed) { - Tcl_DeleteHashTable(ioPtr->destructed); - ckfree((char*)ioPtr->destructed); - } - ItclDeleteObjectsDictInfo(ioPtr->interp, ioPtr); - /* - * Delete all context definitions. - */ - while (1) { - hPtr = Tcl_FirstHashEntry(&ioPtr->contextCache, &place); - if (hPtr == NULL) { - break; - } - callContextPtr = Tcl_GetHashValue(hPtr); - Tcl_DeleteHashEntry(hPtr); - ckfree((char *)callContextPtr); - } - FOREACH_HASH_VALUE(var, &ioPtr->objectVariables) { - Itcl_ReleaseVar(var); - } - - Tcl_DeleteHashTable(&ioPtr->contextCache); - Tcl_DeleteHashTable(&ioPtr->objectVariables); - Tcl_DeleteHashTable(&ioPtr->objectOptions); - Tcl_DeleteHashTable(&ioPtr->objectComponents); - Tcl_DeleteHashTable(&ioPtr->objectMethodVariables); - Tcl_DeleteHashTable(&ioPtr->objectDelegatedOptions); - Tcl_DeleteHashTable(&ioPtr->objectDelegatedFunctions); - Tcl_DecrRefCount(ioPtr->namePtr); - Tcl_DecrRefCount(ioPtr->origNamePtr); - if (ioPtr->createNamePtr != NULL) { - Tcl_DecrRefCount(ioPtr->createNamePtr); - } - if (ioPtr->hullWindowNamePtr != NULL) { - Tcl_DecrRefCount(ioPtr->hullWindowNamePtr); - } - Tcl_DecrRefCount(ioPtr->varNsNamePtr); - if (ioPtr->resolvePtr != NULL) { - ckfree((char *)ioPtr->resolvePtr->clientData); - ckfree((char*)ioPtr->resolvePtr); - } - ckfree((char*)ioPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclObjectCmd() - * - * ------------------------------------------------------------------------ - */ - -static int -CallPublicObjectCmd( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - Tcl_Object *oPtr = data[0]; - Tcl_Class clsPtr = data[1]; - Tcl_Obj *const* objv = data[3]; - int objc = PTR2INT(data[2]); - - ItclShowArgs(1, "CallPublicObjectCmd", objc, objv); - result = Itcl_PublicObjectCmd(oPtr, interp, clsPtr, objc, objv); - ItclShowArgs(1, "CallPublicObjectCmd DONE", objc, objv); - return result; -} - -int -ItclObjectCmd( - ClientData clientData, - Tcl_Interp *interp, - Tcl_Object oPtr, - Tcl_Class clsPtr, - int objc, - Tcl_Obj *const *objv) -{ - Tcl_Obj *methodNamePtr; - Tcl_Obj **newObjv; - Tcl_DString buffer; - Tcl_Obj *myPtr; - ItclMemberFunc *imPtr; - ItclClass *iclsPtr; - Itcl_ListElem *elem; - ItclClass *basePtr; - void *callbackPtr; - const char *className; - const char *tail; - const char *cp; - int isDirectCall; - int incr; - int result; - int found; - - ItclShowArgs(1, "ItclObjectCmd", objc, objv); - - incr = 0; - found = 0; - isDirectCall = 0; - myPtr = NULL; - imPtr = (ItclMemberFunc *)clientData; - iclsPtr = imPtr->iclsPtr; - if (oPtr == NULL) { - ItclClass *icPtr = NULL; - ItclObject *ioPtr = NULL; - - isDirectCall = (clsPtr == NULL); - - if ((imPtr->flags & ITCL_COMMON) - && (imPtr->codePtr != NULL) - && !(imPtr->codePtr->flags & ITCL_BUILTIN)) { - result = Itcl_InvokeProcedureMethod(imPtr->tmPtr, interp, - objc, objv); - return result; - } - - if (TCL_OK == Itcl_GetContext(interp, &icPtr, &ioPtr)) { - oPtr = ioPtr ? ioPtr->oPtr : icPtr->oPtr; - } else { - Tcl_Panic("No Context"); - } - } - methodNamePtr = NULL; - if (objv[0] != NULL) { - Itcl_ParseNamespPath(Tcl_GetString(objv[0]), &buffer, - &className, &tail); - if (className != NULL) { - methodNamePtr = Tcl_NewStringObj(tail, -1); - /* look for the class in the hierarchy */ - cp = className; - if ((*cp == ':') && (*(cp+1) == ':')) { - cp += 2; - } - elem = Itcl_FirstListElem(&iclsPtr->bases); - if (elem == NULL) { - /* check the class itself */ - if (strcmp((const char *)cp, - (const char *)Tcl_GetString(iclsPtr->namePtr)) == 0) { - found = 1; - clsPtr = iclsPtr->clsPtr; - } - } - while (elem != NULL) { - basePtr = (ItclClass*)Itcl_GetListValue(elem); - if (strcmp((const char *)cp, - (const char *)Tcl_GetString(basePtr->namePtr)) == 0) { - clsPtr = basePtr->clsPtr; - found = 1; - break; - } - elem = Itcl_NextListElem(elem); - } - if (!found) { - found = 1; - clsPtr = iclsPtr->clsPtr; - } - } - Tcl_DStringFree(&buffer); - } else { - /* Can this happen? */ - Tcl_Panic("objv[0] is NULL?!"); - /* Panic above replaces obviously broken line below. Creating - * a string value from uninitialized memory cannot possibly be - * a correct thing to do. - - methodNamePtr = Tcl_NewStringObj(tail, -1); - */ - } - if (isDirectCall) { - if (!found) { - if (methodNamePtr != NULL) { - Tcl_DecrRefCount(methodNamePtr); - } - methodNamePtr = objv[0]; - } - } - callbackPtr = Itcl_GetCurrentCallbackPtr(interp); - newObjv = NULL; - if (methodNamePtr != NULL) { - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - char *myName; - /* special handling for mytypemethod, mymethod, myproc */ - myName = Tcl_GetString(methodNamePtr); - if (strcmp(myName, "mytypemethod") == 0) { - result = Itcl_BiMyTypeMethodCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "mymethod") == 0) { - result = Itcl_BiMyMethodCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "myproc") == 0) { - result = Itcl_BiMyProcCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "mytypevar") == 0) { - result = Itcl_BiMyTypeVarCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "myvar") == 0) { - result = Itcl_BiMyVarCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "itcl_hull") == 0) { - result = Itcl_BiItclHullCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "callinstance") == 0) { - result = Itcl_BiCallInstanceCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "getinstancevar") == 0) { - result = Itcl_BiGetInstanceVarCmd(iclsPtr, interp, objc, objv); - return result; - } - if (strcmp(myName, "installcomponent") == 0) { - result = Itcl_BiInstallComponentCmd(iclsPtr, interp, objc, objv); - return result; - } - } - incr = 1; - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+incr)); - myPtr = Tcl_NewStringObj("my", 2); - Tcl_IncrRefCount(myPtr); - Tcl_IncrRefCount(methodNamePtr); - newObjv[0] = myPtr; - newObjv[1] = methodNamePtr; - memcpy(newObjv+incr+1, objv+1, (sizeof(Tcl_Obj*)*(objc-1))); - ItclShowArgs(1, "run CallPublicObjectCmd1", objc+incr, newObjv); - Tcl_NRAddCallback(interp, CallPublicObjectCmd, oPtr, clsPtr, - INT2PTR(objc+incr), newObjv); - - } else { - ItclShowArgs(1, "run CallPublicObjectCmd2", objc, objv); - Tcl_NRAddCallback(interp, CallPublicObjectCmd, oPtr, clsPtr, - INT2PTR(objc), (ClientData)objv); - } - - result = Itcl_NRRunCallbacks(interp, callbackPtr); - if (methodNamePtr != NULL) { - ckfree((char *)newObjv); - Tcl_DecrRefCount(methodNamePtr); - } - if (myPtr != NULL) { - Tcl_DecrRefCount(myPtr); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * GetClassFromClassName() - * ------------------------------------------------------------------------ - */ - -ItclClass * -GetClassFromClassName( - Tcl_Interp *interp, - const char *className, - ItclClass *iclsPtr) -{ - Tcl_Obj *objPtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *basePtr; - Itcl_ListElem *elem; - const char *chkPtr; - int chkLgth; - int lgth; - - /* look for the class in the hierarchy */ - /* first check the class itself */ - if (iclsPtr != NULL) { - if (strcmp(className, - (const char *)Tcl_GetString(iclsPtr->namePtr)) == 0) { - return iclsPtr; - } - elem = Itcl_FirstListElem(&iclsPtr->bases); - while (elem != NULL) { - basePtr = (ItclClass*)Itcl_GetListValue(elem); - basePtr = GetClassFromClassName(interp, className, basePtr); - if (basePtr != NULL) { - return basePtr; - } - elem = Itcl_NextListElem(elem); - } - /* now try to match the classes full name last part with the className */ - lgth = strlen(className); - elem = Itcl_FirstListElem(&iclsPtr->bases); - while (elem != NULL) { - basePtr = (ItclClass*)Itcl_GetListValue(elem); - chkPtr = basePtr->nsPtr->fullName; - chkLgth = strlen(chkPtr); - if (chkLgth >= lgth) { - chkPtr = chkPtr + chkLgth - lgth; - if (strcmp(chkPtr, className) == 0) { - return basePtr; - } - } - elem = Itcl_NextListElem(elem); - } - infoPtr = iclsPtr->infoPtr; - } else { - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - } - /* as a last chance try with className in hash table */ - objPtr = Tcl_NewStringObj(className, -1); - Tcl_IncrRefCount(objPtr); - hPtr = Tcl_FindHashEntry(&infoPtr->nameClasses, (char *)objPtr); - if (hPtr != NULL) { - iclsPtr = Tcl_GetHashValue(hPtr); - } else { - iclsPtr = NULL; - } - Tcl_DecrRefCount(objPtr); - return iclsPtr; -} - -/* - * ------------------------------------------------------------------------ - * ItclMapMethodNameProc() - * ------------------------------------------------------------------------ - */ - -int -ItclMapMethodNameProc( - Tcl_Interp *interp, - Tcl_Object oPtr, - Tcl_Class *startClsPtr, - Tcl_Obj *methodObj) -{ - Tcl_Obj *methodName; - Tcl_Obj *className; - Tcl_DString buffer; - Tcl_HashEntry *hPtr; - Tcl_Namespace * myNsPtr; - ItclObject *ioPtr; - ItclClass *iclsPtr; - ItclClass *iclsPtr2; - ItclObjectInfo *infoPtr; - const char *head; - const char *tail; - const char *sp; - - iclsPtr = NULL; - iclsPtr2 = NULL; - methodName = NULL; - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - ioPtr = (ItclObject *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->object_meta_type); - hPtr = Tcl_FindHashEntry(&infoPtr->objects, (char *)ioPtr); - if ((hPtr == NULL) || (ioPtr == NULL)) { - /* try to get the class (if a class is creating an object) */ - iclsPtr = (ItclClass *)Tcl_ObjectGetMetadata(oPtr, - infoPtr->class_meta_type); - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)iclsPtr); - if (hPtr == NULL) { - char str[20]; - sprintf(str, "%p", iclsPtr); - Tcl_AppendResult(interp, "context class has vanished 1", str, NULL); - return TCL_ERROR; - } - } else { - hPtr = Tcl_FindHashEntry(&infoPtr->classes, (char *)ioPtr->iclsPtr); - if (hPtr == NULL) { - char str[20]; - sprintf(str, "%p", ioPtr->iclsPtr); - Tcl_AppendResult(interp, "context class has vanished 2", str, NULL); - return TCL_ERROR; - } - iclsPtr = ioPtr->iclsPtr; - } - sp = Tcl_GetString(methodObj); - Itcl_ParseNamespPath(sp, &buffer, &head, &tail); - if (head == NULL) { - /* itcl bug #3600923 call private method in class - * without namespace - */ - myNsPtr = Tcl_GetCurrentNamespace(iclsPtr->interp); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *) myNsPtr); - if (hPtr) { - iclsPtr2 = (ItclClass *) Tcl_GetHashValue(hPtr); - if (Itcl_IsMethodCallFrame(iclsPtr->interp) > 0) { - iclsPtr = iclsPtr2; - } - } - } - if (head != NULL) { - className = NULL; - methodName = Tcl_NewStringObj(tail, -1); - Tcl_IncrRefCount(methodName); - className = Tcl_NewStringObj(head, -1); - Tcl_IncrRefCount(className); - if (strlen(head) > 0) { - iclsPtr2 = GetClassFromClassName(interp, head, iclsPtr); - } else { - iclsPtr2 = NULL; - } - if (iclsPtr2 != NULL) { - *startClsPtr = iclsPtr2->clsPtr; - Tcl_SetStringObj(methodObj, Tcl_GetString(methodName), -1); - } - Tcl_DecrRefCount(className); - Tcl_DecrRefCount(methodName); - } - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)methodObj); - if (hPtr == NULL) { - /* special case: we found the class for the class command, - * for a relative or absolute class path name - * but we have no method in that class that fits. - * Problem of Rene Zaumseil when having the object - * for a class in a child namespace of the class - * fossil ticket id: 36577626c340ad59615f0a0238d67872c009a8c9 - */ - *startClsPtr = NULL; - } else { - ItclMemberFunc *imPtr; - Tcl_Namespace *nsPtr; - ItclCmdLookup *clookup; - - nsPtr = Tcl_GetCurrentNamespace(interp); - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - if (!Itcl_CanAccessFunc(imPtr, nsPtr)) { - char *token = Tcl_GetString(imPtr->namePtr); - if ((*token != 'i') || (strcmp(token, "info") != 0)) { - /* needed for test protect-2.5 */ - ItclMemberFunc *imPtr2 = NULL; - Tcl_HashEntry *hPtr; - Tcl_ObjectContext context; - context = Itcl_GetCallFrameClientData(interp); - if (context != NULL) { - hPtr = Tcl_FindHashEntry( - &imPtr->iclsPtr->infoPtr->procMethods, - (char *)Tcl_ObjectContextMethod(context)); - if (hPtr != NULL) { - imPtr2 = Tcl_GetHashValue(hPtr); - } - if ((imPtr->protection & ITCL_PRIVATE) && - (imPtr2 != NULL) && - (imPtr->iclsPtr->nsPtr != imPtr2->iclsPtr->nsPtr)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid command name \"", - token, - "\"", NULL); - return TCL_ERROR; - } - } - /* END needed for test protect-2.5 */ - if (ioPtr == NULL) { - /* itcl in fossil ticket: 2cd667f270b68ef66d668338e09d144e20405e23 */ - Tcl_HashEntry *hPtr; - Tcl_Obj * objPtr; - ItclMemberFunc *imPtr2 = NULL; - ItclCmdLookup *clookupPtr; - - objPtr = Tcl_NewStringObj(token, -1); - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - if (hPtr != NULL) { - clookupPtr = Tcl_GetHashValue(hPtr); - imPtr2 = clookupPtr->imPtr; - } - if ((imPtr->protection & ITCL_PRIVATE) && - (imPtr2 != NULL) && - (imPtr->iclsPtr->nsPtr == imPtr2->iclsPtr->nsPtr)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "invalid command name \"", - token, - "\"", NULL); - return TCL_ERROR; - } - } else { - Tcl_AppendResult(interp, - "bad option \"", token, "\": should be one of...", - (char*)NULL); - ItclReportObjectUsage(interp, ioPtr, nsPtr, nsPtr); - return TCL_ERROR; - - } - } - } - } - Tcl_DStringFree(&buffer); - return TCL_OK; -} - -int -ExpandDelegateAs( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr, - ItclDelegatedFunction *idmPtr, - const char *funcName, - Tcl_Obj *listPtr) -{ - Tcl_Obj *componentNamePtr; - Tcl_Obj *objPtr; - const char **argv; - const char *val; - int argc; - int j; - - - if (idmPtr->icPtr == NULL) { - componentNamePtr = NULL; - } else { - componentNamePtr = idmPtr->icPtr->namePtr; - } - if (idmPtr->asPtr != NULL) { - Tcl_SplitList(interp, Tcl_GetString(idmPtr->asPtr), - &argc, &argv); - for(j=0;j<argc;j++) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(argv[j], -1)); - } - ckfree((char *)argv); - } else { - if (idmPtr->usingPtr != NULL) { - char *cp; - char *ep; - int hadDoublePercent; - Tcl_Obj *strPtr; - - strPtr = NULL; - hadDoublePercent = 0; - cp = Tcl_GetString(idmPtr->usingPtr); - ep = cp; - strPtr = Tcl_NewStringObj("", -1); - while (*ep != '\0') { - if (*ep == '%') { - if (*(ep+1) == '%') { - cp++; - cp++; - ep++; - ep++; - hadDoublePercent = 1; - Tcl_AppendToObj(strPtr, "%", -1); - continue; - } - switch (*(ep+1)) { - case 'c': - if (componentNamePtr == NULL) { - ep++; - continue; - } - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr, (Tcl_GetObjectNamespace( - iclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, - Tcl_GetString(componentNamePtr), -1); - val = Tcl_GetVar2(interp, Tcl_GetString(objPtr), - NULL, 0); - Tcl_DecrRefCount(objPtr); - Tcl_AppendToObj(strPtr, - val, -1); - break; - case 'j': - case 'm': - case 'M': - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - if (strcmp(Tcl_GetString(idmPtr->namePtr), "*") == 0) { - Tcl_AppendToObj(strPtr, funcName, -1); - } else { - Tcl_AppendToObj(strPtr, - Tcl_GetString(idmPtr->namePtr), -1); - } - break; - case 'n': - if (iclsPtr->flags & ITCL_TYPE) { - ep++; - continue; - } else { - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - Tcl_AppendToObj(strPtr, iclsPtr->nsPtr->name, -1); - } - break; - case 's': - if (iclsPtr->flags & ITCL_TYPE) { - ep++; - continue; - } else { - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - Tcl_AppendToObj(strPtr, - Tcl_GetString(ioPtr->namePtr), -1); - } - break; - case 't': - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - Tcl_AppendToObj(strPtr, iclsPtr->nsPtr->fullName, -1); - break; - case 'w': - if (iclsPtr->flags & ITCL_TYPE) { - ep++; - continue; - } else { - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - } - break; - case ':': - /* substitute with contents of variable after ':' */ - if (iclsPtr->flags & ITCL_ECLASS) { - if (ep-cp-1 > 0) { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - ep++; - cp = ep + 1; - while (*ep && (*ep != ' ')) { - ep++; - } - if (ep-cp > 0) { - Tcl_Obj *my_obj; - const char *cp2; - - my_obj = Tcl_NewStringObj(cp, ep-cp); - if (iclsPtr->infoPtr->currIoPtr != NULL) { - cp2 = GetConstructorVar(interp, iclsPtr, - Tcl_GetString(my_obj)); - } else { - cp2 = ItclGetInstanceVar(interp, - Tcl_GetString(my_obj), NULL, ioPtr, - iclsPtr); - } - if (cp2 != NULL) { - Tcl_AppendToObj(strPtr, cp2, -1); - } - ep -= 2; /* to fit for code after default !! */ - } - break; - } else { - /* fall through */ - } - default: - { - char buf[2]; - buf[1] = '\0'; - sprintf(buf, "%c", *(ep+1)); - Tcl_AppendResult(interp, - "there is no %%", buf, " substitution", - NULL); - if (strPtr != NULL) { - Tcl_DecrRefCount(strPtr); - } - return TCL_ERROR; - } - } - Tcl_ListObjAppendElement(interp, listPtr, strPtr); - hadDoublePercent = 0; - strPtr = Tcl_NewStringObj("", -1); - ep +=2; - cp = ep; - } else { - if (*ep == ' ') { - if (strlen(Tcl_GetString(strPtr)) > 0) { - if (ep-cp == 0) { - Tcl_ListObjAppendElement(interp, listPtr, - strPtr); - strPtr = Tcl_NewStringObj("", -1); - } - } - if (ep-cp > 0) { - Tcl_AppendToObj(strPtr, cp, ep-cp); - Tcl_ListObjAppendElement(interp, listPtr, strPtr); - strPtr = Tcl_NewStringObj("", -1); - } - while((*ep != '\0') && (*ep == ' ')) { - ep++; - } - cp = ep; - } else { - ep++; - } - } - } - if (hadDoublePercent) { - /* FIXME need code here */ - } - if (cp != ep) { - if (*ep == '\0') { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp)); - } else { - Tcl_ListObjAppendElement(interp, listPtr, - Tcl_NewStringObj(cp, ep-cp-1)); - } - } - if (strPtr != NULL) { - Tcl_DecrRefCount(strPtr); - } - } else { - Tcl_ListObjAppendElement(interp, listPtr, idmPtr->namePtr); - } - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * DelegationFunction() - * ------------------------------------------------------------------------ - */ - -int -DelegateFunction( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr, - Tcl_Obj *componentValuePtr, - ItclDelegatedFunction *idmPtr) -{ - Tcl_Obj *listPtr; - const char *val; - int result; - Tcl_Method mPtr; - - listPtr = Tcl_NewListObj(0, NULL); - if (componentValuePtr != NULL) { - if (idmPtr->usingPtr == NULL) { - Tcl_ListObjAppendElement(interp, listPtr, componentValuePtr); - } - } - result = ExpandDelegateAs(interp, ioPtr, iclsPtr, idmPtr, - Tcl_GetString(idmPtr->namePtr), listPtr); - if (result != TCL_OK) { - Tcl_DecrRefCount(listPtr); - return result; - } - val = Tcl_GetString(listPtr); - if (val == NULL) { - /* FIXME need code here */ - } - if (componentValuePtr != NULL) { - mPtr = Itcl_NewForwardClassMethod(interp, iclsPtr->clsPtr, 1, - idmPtr->namePtr, listPtr); - if (mPtr != NULL) { - return TCL_OK; - } - } - if (idmPtr->usingPtr != NULL) { - mPtr = Itcl_NewForwardClassMethod(interp, iclsPtr->clsPtr, 1, - idmPtr->namePtr, listPtr); - if (mPtr != NULL) { - return TCL_OK; - } - } - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * DelegatedOptionsInstall() - * ------------------------------------------------------------------------ - */ - -int -DelegatedOptionsInstall( - Tcl_Interp *interp, - ItclClass *iclsPtr) -{ - Tcl_HashEntry *hPtr2; - Tcl_HashSearch search2; - ItclDelegatedOption *idoPtr; - ItclOption *ioptPtr; - FOREACH_HASH_DECLS; - char *optionName; - - FOREACH_HASH_VALUE(idoPtr, &iclsPtr->delegatedOptions) { - optionName = Tcl_GetString(idoPtr->namePtr); - if (*optionName == '*') { - /* allow nested FOREACH */ - search2 = search; - FOREACH_HASH_VALUE(ioptPtr, &iclsPtr->options) { - if (Tcl_FindHashEntry(&idoPtr->exceptions, - (char *)idoPtr->namePtr) == NULL) { - ioptPtr->idoPtr = idoPtr; - Itcl_PreserveData(ioptPtr->idoPtr); - } - } - search = search2; - } else { - hPtr2 = Tcl_FindHashEntry(&iclsPtr->options, - (char *)idoPtr->namePtr); - if (hPtr2 == NULL) { - ioptPtr = NULL; - } else { - ioptPtr = Tcl_GetHashValue(hPtr2); - ioptPtr->idoPtr = idoPtr; - } - idoPtr->ioptPtr = ioptPtr; - } - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * GetConstructorVar() - * get an object variable when in executing the constructor - * ------------------------------------------------------------------------ - */ - -static const char * -GetConstructorVar( - Tcl_Interp *interp, - ItclClass *iclsPtr, - const char *varName) - -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - Tcl_DString buffer; - ItclVarLookup *vlookup; - ItclVariable *ivPtr; - const char *val; - - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, (char *)varName); - if (hPtr == NULL) { - /* no such variable */ - return NULL; - } - vlookup = (ItclVarLookup *)Tcl_GetHashValue(hPtr); - if (vlookup == NULL) { - return NULL; - } - ivPtr = vlookup->ivPtr; - if (ivPtr == NULL) { - return NULL; - } - if (ivPtr->flags & ITCL_COMMON) { - /* look for a common variable */ - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr, (Tcl_GetObjectNamespace( - iclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, varName, -1); - val = Tcl_GetVar2(interp, Tcl_GetString(objPtr), NULL, 0); - Tcl_DecrRefCount(objPtr); - } else { - /* look for a normal variable */ - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, - Tcl_GetString(iclsPtr->infoPtr->currIoPtr->varNsNamePtr), -1); - Tcl_DStringAppend(&buffer, ivPtr->iclsPtr->nsPtr->fullName, -1); - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, varName, -1); - val = Tcl_GetVar2(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - } - return val; -} - -/* - * ------------------------------------------------------------------------ - * DelegationInstall() - * ------------------------------------------------------------------------ - */ - -int -DelegationInstall( - Tcl_Interp *interp, - ItclObject *ioPtr, - ItclClass *iclsPtr) -{ - Tcl_HashEntry *hPtr2; - Tcl_HashSearch search2; - Tcl_Obj *componentValuePtr; - Tcl_DString buffer; - ItclDelegatedFunction *idmPtr; - ItclMemberFunc *imPtr; - ItclVariable *ivPtr; - FOREACH_HASH_DECLS; - char *methodName; - const char *val; - int result; - int noDelegate; - int delegateAll; - - result = TCL_OK; - delegateAll = 0; - ioPtr->noComponentTrace = 1; - noDelegate = ITCL_CONSTRUCTOR|ITCL_DESTRUCTOR|ITCL_COMPONENT; - componentValuePtr = NULL; - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - methodName = Tcl_GetString(idmPtr->namePtr); - if (*methodName == '*') { - delegateAll = 1; - } - if (idmPtr->icPtr != NULL) { - Tcl_Obj *objPtr; - /* we cannot use Itcl_GetInstanceVar here as the object is not - * yet completely built. So use the varNsNamePtr - */ - ivPtr = idmPtr->icPtr->ivPtr; - if (ivPtr->flags & ITCL_COMMON) { - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - - Tcl_AppendToObj(objPtr, (Tcl_GetObjectNamespace( - ivPtr->iclsPtr->oPtr))->fullName, -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, - Tcl_GetString(idmPtr->icPtr->namePtr), -1); - val = Tcl_GetVar2(interp, Tcl_GetString(objPtr), NULL, 0); - Tcl_DecrRefCount(objPtr); - } else { - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, - Tcl_GetString(ioPtr->varNsNamePtr), -1); - Tcl_DStringAppend(&buffer, - Tcl_GetString(ivPtr->fullNamePtr), -1); - val = Tcl_GetVar2(interp, - Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - } - componentValuePtr = Tcl_NewStringObj(val, -1); - Tcl_IncrRefCount(componentValuePtr); - } else { - componentValuePtr = NULL; - } - if (!delegateAll) { - result = DelegateFunction(interp, ioPtr, iclsPtr, - componentValuePtr, idmPtr); - if (result != TCL_OK) { - ioPtr->noComponentTrace = 0; - return result; - } - } else { - /* save to allow nested FOREACH */ - search2 = search; - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - methodName = Tcl_GetString(imPtr->namePtr); - if (imPtr->flags & noDelegate) { - continue; - } - if (strcmp(methodName, "info") == 0) { - continue; - } - if (strcmp(methodName, "isa") == 0) { - continue; - } - if (strcmp(methodName, "createhull") == 0) { - continue; - } - if (strcmp(methodName, "keepcomponentoption") == 0) { - continue; - } - if (strcmp(methodName, "ignorecomponentoption") == 0) { - continue; - } - if (strcmp(methodName, "renamecomponentoption") == 0) { - continue; - } - if (strcmp(methodName, "setupcomponent") == 0) { - continue; - } - if (strcmp(methodName, "itcl_initoptions") == 0) { - continue; - } - if (strcmp(methodName, "mytypemethod") == 0) { - continue; - } - if (strcmp(methodName, "mymethod") == 0) { - continue; - } - if (strcmp(methodName, "myproc") == 0) { - continue; - } - if (strcmp(methodName, "mytypevar") == 0) { - continue; - } - if (strcmp(methodName, "myvar") == 0) { - continue; - } - if (strcmp(methodName, "itcl_hull") == 0) { - continue; - } - if (strcmp(methodName, "callinstance") == 0) { - continue; - } - if (strcmp(methodName, "getinstancevar") == 0) { - continue; - } - hPtr2 = Tcl_FindHashEntry(&idmPtr->exceptions, - (char *)imPtr->namePtr); - if (hPtr2 != NULL) { - continue; - } - result = DelegateFunction(interp, ioPtr, iclsPtr, - componentValuePtr, idmPtr); - if (result != TCL_OK) { - break; - } - } - search = search2; - } - if (componentValuePtr != NULL) { - Tcl_DecrRefCount(componentValuePtr); - } - } - ioPtr->noComponentTrace = 0; - result = DelegatedOptionsInstall(interp, iclsPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclInitExtendedClassOptions() - * ------------------------------------------------------------------------ - */ - -static int -ItclInitExtendedClassOptions( - Tcl_Interp *interp, - ItclObject *ioPtr) -{ - ItclClass *iclsPtr; - ItclOption *ioptPtr; - ItclHierIter hier; - FOREACH_HASH_DECLS; - - iclsPtr = ioPtr->iclsPtr; - Itcl_InitHierIter(&hier, iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - FOREACH_HASH_VALUE(ioptPtr, &iclsPtr->options) { - if (ioptPtr->defaultValuePtr != NULL) { - if (ItclGetInstanceVar(interp, "itcl_options", - Tcl_GetString(ioptPtr->namePtr), ioPtr, iclsPtr) - == NULL) { - } - } - } - } - Itcl_DeleteHierIter(&hier); - return TCL_OK; -} - -ItclClass * -ItclNamespace2Class(Tcl_Namespace *nsPtr) -{ - ItclObjectInfo * infoPtr; - Tcl_HashEntry *hPtr; - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(((Namespace *)nsPtr)->interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&(infoPtr->namespaceClasses), nsPtr); - if (hPtr == NULL) { - return NULL; - } - return Tcl_GetHashValue(hPtr); -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclParse.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclParse.c deleted file mode 100644 index 9b34dc6..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclParse.c +++ /dev/null @@ -1,4309 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * Procedures in this file support the new syntax for [incr Tcl] - * class definitions: - * - * itcl_class <className> { - * inherit <base-class>... - * - * constructor {<arglist>} ?{<init>}? {<body>} - * destructor {<body>} - * - * method <name> {<arglist>} {<body>} - * proc <name> {<arglist>} {<body>} - * variable <name> ?<init>? ?<config>? - * common <name> ?<init>? - * - * public <thing> ?<args>...? - * protected <thing> ?<args>...? - * private <thing> ?<args>...? - * } - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -static const char initWidgetScript[] = -"namespace eval ::itcl {\n" -" proc _find_widget_init {} {\n" -" global env tcl_library\n" -" variable library\n" -" variable patchLevel\n" -" rename _find_widget_init {}\n" -" if {[info exists library]} {\n" -" lappend dirs $library\n" -" } else {\n" -" if {[catch {uplevel #0 source -rsrc itcl}] == 0} {\n" -" return\n" -" }\n" -" set dirs {}\n" -" if {[info exists env(ITCL_LIBRARY)]} {\n" -" lappend dirs $env(ITCL_LIBRARY)\n" -" }\n" -" lappend dirs [file join [file dirname $tcl_library] itcl$patchLevel]\n" -" set bindir [file dirname [info nameofexecutable]]\n" -" lappend dirs [file join . library]\n" -" lappend dirs [file join $bindir .. lib itcl$patchLevel]\n" -" lappend dirs [file join $bindir .. library]\n" -" lappend dirs [file join $bindir .. .. library]\n" -" lappend dirs [file join $bindir .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. .. itcl library]\n" -" lappend dirs [file join $bindir .. .. itcl-ng itcl library]\n" -" # On MacOSX, check the directories in the tcl_pkgPath\n" -" if {[string equal $::tcl_platform(platform) \"unix\"] &&" -" [string equal $::tcl_platform(os) \"Darwin\"]} {\n" -" foreach d $::tcl_pkgPath {\n" -" lappend dirs [file join $d itcl$patchLevel]\n" -" }\n" -" }\n" -" # On *nix, check the directories in the tcl_pkgPath\n" -" if {[string equal $::tcl_platform(platform) \"unix\"]} {\n" -" foreach d $::tcl_pkgPath {\n" -" lappend dirs $d\n" -" lappend dirs [file join $d itcl$patchLevel]\n" -" }\n" -" }\n" -" }\n" -" foreach i $dirs {\n" -" set library $i\n" -" set itclfile [file join $i itclWidget.tcl]\n" -" if {![catch {uplevel #0 [list source $itclfile]} msg]} {\n" -" return\n" -" }\n" -" }\n" -" set msg \"Can't find a usable itclWidget.tcl in the following directories:\n\"\n" -" append msg \" $dirs\n\"\n" -" append msg \"This probably means that Itcl/Tcl weren't installed properly.\n\"\n" -" append msg \"If you know where the Itcl library directory was installed,\n\"\n" -" append msg \"you can set the environment variable ITCL_LIBRARY to point\n\"\n" -" append msg \"to the library directory.\n\"\n" -" error $msg\n" -" }\n" -" _find_widget_init\n" -"}"; - -/* - * Info needed for public/protected/private commands: - */ -typedef struct ProtectionCmdInfo { - int pLevel; /* protection level */ - ItclObjectInfo *infoPtr; /* info regarding all known objects */ -} ProtectionCmdInfo; - -/* - * FORWARD DECLARATIONS - */ -static Tcl_CmdDeleteProc ItclFreeParserCommandData; -static void ItclDelObjectInfo(char* cdata); -static int ItclInitClassCommon(Tcl_Interp *interp, ItclClass *iclsPtr, - ItclVariable *ivPtr, const char *initStr); - -static Tcl_ObjCmdProc Itcl_ClassTypeVariableCmd; -static Tcl_ObjCmdProc Itcl_ClassTypeMethodCmd; -static Tcl_ObjCmdProc Itcl_ClassFilterCmd; -static Tcl_ObjCmdProc Itcl_ClassMixinCmd; -static Tcl_ObjCmdProc Itcl_WidgetCmd; -static Tcl_ObjCmdProc Itcl_WidgetAdaptorCmd; -static Tcl_ObjCmdProc Itcl_ClassComponentCmd; -static Tcl_ObjCmdProc Itcl_ClassTypeComponentCmd; -static Tcl_ObjCmdProc Itcl_ClassDelegateMethodCmd; -static Tcl_ObjCmdProc Itcl_ClassDelegateOptionCmd; -static Tcl_ObjCmdProc Itcl_ClassDelegateTypeMethodCmd; -static Tcl_ObjCmdProc Itcl_ClassForwardCmd; -static Tcl_ObjCmdProc Itcl_ClassMethodVariableCmd; -static Tcl_ObjCmdProc Itcl_ClassTypeConstructorCmd; -static Tcl_ObjCmdProc ItclGenericClassCmd; - -static const struct { - const char *name; - Tcl_ObjCmdProc *objProc; -} parseCmds[] = { - {"common", Itcl_ClassCommonCmd}, - {"component", Itcl_ClassComponentCmd}, - {"constructor", Itcl_ClassConstructorCmd}, - {"destructor", Itcl_ClassDestructorCmd}, - {"filter", Itcl_ClassFilterCmd}, - {"forward", Itcl_ClassForwardCmd}, - {"handleClass", Itcl_HandleClass}, - {"hulltype", Itcl_ClassHullTypeCmd}, - {"inherit", Itcl_ClassInheritCmd}, - {"method", Itcl_ClassMethodCmd}, - {"methodvariable", Itcl_ClassMethodVariableCmd}, - {"mixin", Itcl_ClassMixinCmd}, - {"option", Itcl_ClassOptionCmd}, - {"proc", Itcl_ClassProcCmd}, - {"typecomponent", Itcl_ClassTypeComponentCmd }, - {"typeconstructor", Itcl_ClassTypeConstructorCmd}, - {"typemethod", Itcl_ClassTypeMethodCmd}, - {"typevariable", Itcl_ClassTypeVariableCmd}, - {"variable", Itcl_ClassVariableCmd}, - {"widgetclass", Itcl_ClassWidgetClassCmd}, - {NULL, NULL} -}; - -static const struct { - const char *name; - Tcl_ObjCmdProc *objProc; - int protection; -} protectionCmds[] = { - {"private", Itcl_ClassProtectionCmd, ITCL_PRIVATE}, - {"protected", Itcl_ClassProtectionCmd, ITCL_PROTECTED}, - {"public", Itcl_ClassProtectionCmd, ITCL_PUBLIC}, - {NULL, NULL, 0} -}; - -/* - * ------------------------------------------------------------------------ - * Itcl_ParseInit() - * - * Invoked by Itcl_Init() whenever a new interpeter is created to add - * [incr Tcl] facilities. Adds the commands needed to parse class - * definitions. - * ------------------------------------------------------------------------ - */ -int -Itcl_ParseInit( - Tcl_Interp *interp, /* interpreter to be updated */ - ItclObjectInfo *infoPtr) /* info regarding all known objects and classes */ -{ - Tcl_Namespace *parserNs; - ProtectionCmdInfo *pInfoPtr; - Tcl_DString buffer; - int i; - - /* - * Create the "itcl::parser" namespace used to parse class - * definitions. - */ - parserNs = Tcl_CreateNamespace(interp, "::itcl::parser", - (ClientData)infoPtr, Itcl_ReleaseData); - - if (!parserNs) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - " (cannot initialize itcl parser)", - (char*)NULL); - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Add commands for parsing class definitions. - */ - Tcl_DStringInit(&buffer); - for (i=0 ; parseCmds[i].name ; i++) { - Tcl_DStringAppend(&buffer, "::itcl::parser::", 16); - Tcl_DStringAppend(&buffer, parseCmds[i].name, -1); - Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer), - parseCmds[i].objProc, (ClientData) infoPtr, NULL); - Tcl_DStringFree(&buffer); - } - - for (i=0 ; protectionCmds[i].name ; i++) { - Tcl_DStringAppend(&buffer, "::itcl::parser::", 16); - Tcl_DStringAppend(&buffer, protectionCmds[i].name, -1); - pInfoPtr = (ProtectionCmdInfo*)ckalloc(sizeof(ProtectionCmdInfo)); - pInfoPtr->pLevel = protectionCmds[i].protection; - pInfoPtr->infoPtr = infoPtr; - Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer), - protectionCmds[i].objProc, (ClientData) pInfoPtr, - (Tcl_CmdDeleteProc*) ItclFreeParserCommandData); - Tcl_DStringFree(&buffer); - } - - /* - * Set the runtime variable resolver for the parser namespace, - * to control access to "common" data members while parsing - * the class definition. - */ - if (infoPtr->useOldResolvers) { - ItclSetParserResolver(parserNs); - } - /* - * Install the "class" command for defining new classes. - */ - Tcl_CreateObjCommand(interp, "::itcl::class", Itcl_ClassCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::body", Itcl_BodyCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); - - Tcl_CreateObjCommand(interp, "::itcl::configbody", Itcl_ConfigBodyCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); - - Itcl_EventuallyFree((ClientData)infoPtr, ItclDelObjectInfo); - - /* - * Create the "itcl::find" command for high-level queries. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::find") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::find", - "classes", "?pattern?", - Itcl_FindClassesCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::find", - "objects", "?-class className? ?-isa className? ?pattern?", - Itcl_FindObjectsCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - - /* - * Create the "itcl::delete" command to delete objects - * and classes. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::delete") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::delete", - "class", "name ?name...?", - Itcl_DelClassCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::delete", - "object", "name ?name...?", - Itcl_DelObjectCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::delete", - "ensemble", "name ?name...?", - Itcl_EnsembleDeleteCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Create the "itcl::is" command to test object - * and classes existence. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::is") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::is", - "class", "name", Itcl_IsClassCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::is", - "object", "?-class classname? name", Itcl_IsObjectCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - - /* - * Add "code" and "scope" commands for handling scoped values. - */ - Tcl_CreateObjCommand(interp, "::itcl::code", Itcl_CodeCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); - - Tcl_CreateObjCommand(interp, "::itcl::scope", Itcl_ScopeCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL); - - /* - * Add the "filter" commands (add/delete) - */ - if (Itcl_CreateEnsemble(interp, "::itcl::filter") != TCL_OK) { - return TCL_ERROR; - } - if (Itcl_AddEnsemblePart(interp, "::itcl::filter", - "add", "objectOrClass filter ? ... ?", Itcl_FilterAddCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::filter", - "delete", "objectOrClass filter ? ... ?", Itcl_FilterDeleteCmd, - (ClientData)infoPtr, Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Add the "forward" commands (add/delete) - */ - if (Itcl_CreateEnsemble(interp, "::itcl::forward") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::forward", - "add", "objectOrClass srcCommand targetCommand ? options ... ?", - Itcl_ForwardAddCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::forward", - "delete", "objectOrClass targetCommand ? ... ?", - Itcl_ForwardDeleteCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Add the "mixin" (add/delete) commands. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::mixin") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::mixin", - "add", "objectOrClass class ? class ... ?", - Itcl_MixinAddCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::mixin", - "delete", "objectOrClass class ? class ... ?", - Itcl_MixinDeleteCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Add commands for handling import stubs at the Tcl level. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::import::stub") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::import::stub", - "create", "name", Itcl_StubCreateCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL) != TCL_OK) { - return TCL_ERROR; - } - if (Itcl_AddEnsemblePart(interp, "::itcl::import::stub", - "exists", "name", Itcl_StubExistsCmd, - (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL) != TCL_OK) { - return TCL_ERROR; - } - - Tcl_CreateObjCommand(interp, "::itcl::type", Itcl_TypeClassCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::widget", Itcl_WidgetCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::widgetadaptor", Itcl_WidgetAdaptorCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::nwidget", Itcl_NWidgetCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::addoption", Itcl_AddOptionCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::addobjectoption", - Itcl_AddObjectOptionCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::adddelegatedoption", - Itcl_AddDelegatedOptionCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::adddelegatedmethod", - Itcl_AddDelegatedFunctionCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::addcomponent", Itcl_AddComponentCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::setcomponent", Itcl_SetComponentCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, "::itcl::extendedclass", Itcl_ExtendedClassCmd, - (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - Tcl_CreateObjCommand(interp, ITCL_COMMANDS_NAMESPACE "::genericclass", - ItclGenericClassCmd, (ClientData)infoPtr, Itcl_ReleaseData); - Itcl_PreserveData((ClientData)infoPtr); - - /* - * Add the "delegate" (method/option) commands. - */ - if (Itcl_CreateEnsemble(interp, "::itcl::parser::delegate") != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_AddEnsemblePart(interp, "::itcl::parser::delegate", - "method", "name to targetName as scipt using script", - Itcl_ClassDelegateMethodCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::parser::delegate", - "typemethod", "name to targetName as scipt using script", - Itcl_ClassDelegateTypeMethodCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - if (Itcl_AddEnsemblePart(interp, "::itcl::parser::delegate", - "option", "option to targetOption as script", - Itcl_ClassDelegateOptionCmd, (ClientData)infoPtr, - Itcl_ReleaseData) != TCL_OK) { - return TCL_ERROR; - } - Itcl_PreserveData((ClientData)infoPtr); - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::class" command to - * specify a class definition. Handles the following syntax: - * - * itcl::class <className> { - * inherit <base-class>... - * - * constructor {<arglist>} ?{<init>}? {<body>} - * destructor {<body>} - * - * method <name> {<arglist>} {<body>} - * proc <name> {<arglist>} {<body>} - * variable <varname> ?<init>? ?<config>? - * common <varname> ?<init>? - * - * public <args>... - * protected <args>... - * private <args>... - * } - * - * ------------------------------------------------------------------------ - */ -static int -ItclGenericClassCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *namePtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclComponent *icPtr; - const char *typeStr; - int result; - - - ItclShowArgs(1, "ItclGenericClassCmd", objc-1, objv); - if (objc != 4) { - Tcl_AppendResult(interp, "usage: genericclass <classtype> <classname> ", - "<body>", NULL); - return TCL_ERROR; - } - infoPtr = (ItclObjectInfo *)clientData; - typeStr = Tcl_GetString(objv[1]); - hPtr = Tcl_FindHashEntry(&infoPtr->classTypes, (char *)objv[1]); - if (hPtr == NULL) { - Tcl_AppendResult(interp, "genericclass bad classtype \"", typeStr, - "\"", NULL); - return TCL_ERROR; - } - result = ItclClassBaseCmd(clientData, interp, PTR2INT(Tcl_GetHashValue(hPtr)), - objc - 1, objv + 1, &iclsPtr); - if (result != TCL_OK) { - return result; - } - if (PTR2INT(Tcl_GetHashValue(hPtr)) == ITCL_WIDGETADAPTOR) { - /* create the itcl_hull variable */ - namePtr = Tcl_NewStringObj("itcl_hull", -1); - if (ItclCreateComponent(interp, iclsPtr, namePtr, ITCL_COMMON, - &icPtr) != TCL_OK) { - return TCL_ERROR; - } - iclsPtr->numVariables++; - Itcl_BuildVirtualTables(iclsPtr); - } - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, Tcl_GetString(iclsPtr->fullNamePtr), NULL); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCmd() - * - * Invoked by Tcl whenever the user issues an "itcl::class" command to - * specify a class definition. Handles the following syntax: - * - * itcl::class <className> { - * inherit <base-class>... - * - * constructor {<arglist>} ?{<init>}? {<body>} - * destructor {<body>} - * - * method <name> {<arglist>} {<body>} - * proc <name> {<arglist>} {<body>} - * variable <varname> ?<init>? ?<config>? - * common <varname> ?<init>? - * - * public <args>... - * protected <args>... - * private <args>... - * } - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclClass *iclsPtr; - - return ItclClassBaseCmd(clientData, interp, ITCL_CLASS, objc, objv, - &iclsPtr); -} - -/* - * ------------------------------------------------------------------------ - * ItclClassBaseCmd() - * - * ------------------------------------------------------------------------ - */ - -static Tcl_MethodCallProc ObjCallProc; -static Tcl_MethodCallProc ArgCallProc; -static Tcl_CloneProc CloneProc; - -static const Tcl_MethodType itclObjMethodType = { - TCL_OO_METHOD_VERSION_CURRENT, - "itcl objv method", - ObjCallProc, - ItclReleaseIMF, - CloneProc -}; - -static const Tcl_MethodType itclArgMethodType = { - TCL_OO_METHOD_VERSION_CURRENT, - "itcl argv method", - ArgCallProc, - ItclReleaseIMF, - CloneProc -}; - -static int -CloneProc( - Tcl_Interp *interp, - ClientData original, - ClientData *copyPtr) -{ - ItclPreserveIMF((ItclMemberFunc *)original); - *copyPtr = original; - return TCL_OK; -} - -static int -CallAfterCallMethod( - ClientData data[], - Tcl_Interp *interp, - int result) -{ - ClientData clientData = data[0]; - Tcl_ObjectContext context = data[1]; - - return ItclAfterCallMethod(clientData, interp, context, NULL, result); -} - -static int -ObjCallProc( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext context, - int objc, - Tcl_Obj *const *objv) -{ - ItclMemberFunc *imPtr = (ItclMemberFunc *)clientData; - - if (TCL_ERROR == ItclCheckCallMethod(clientData, interp, context, - NULL, NULL)) { - return TCL_ERROR; - } - - Tcl_NRAddCallback(interp, CallAfterCallMethod, clientData, context, - NULL, NULL); - - if ((imPtr->flags & ITCL_COMMON) == 0) { - return Itcl_ExecMethod(clientData, interp, objc-1, objv+1); - } else { - return Itcl_ExecProc(clientData, interp, objc-1, objv+1); - } -} - -static int -ArgCallProc( - ClientData clientData, - Tcl_Interp *interp, - Tcl_ObjectContext context, - int objc, - Tcl_Obj *const *objv) -{ - return TCL_ERROR; -} - -int -ItclClassBaseCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int flags, /* flags: ITCL_CLASS, ITCL_TYPE, - * ITCL_WIDGET or ITCL_WIDGETADAPTOR */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[], /* argument objects */ - ItclClass **iclsPtrPtr) /* for returning iclsPtr */ -{ - Tcl_Obj *argumentPtr; - Tcl_Obj *bodyPtr; - FOREACH_HASH_DECLS; - Tcl_HashEntry *hPtr2; - Tcl_Namespace *parserNs, *ooNs; - Tcl_CallFrame frame; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - ItclObjectInfo* infoPtr; - char *className; - int isNewEntry; - int result; - int noCleanup; - ItclMemberFunc *imPtr; - - infoPtr = (ItclObjectInfo*)clientData; - if (iclsPtrPtr != NULL) { - *iclsPtrPtr = NULL; - } - if (objc != 3) { - Tcl_WrongNumArgs(interp, 1, objv, "name { definition }"); - return TCL_ERROR; - } - ItclShowArgs(1, "ItclClassBaseCmd", objc, objv); - className = Tcl_GetString(objv[1]); - - noCleanup = 0; - /* - * Find the namespace to use as a parser for the class definition. - * If for some reason it is destroyed, bail out here. - */ - parserNs = Tcl_FindNamespace(interp, "::itcl::parser", - (Tcl_Namespace*)NULL, TCL_LEAVE_ERR_MSG); - - if (parserNs == NULL) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while parsing class definition for \"%s\")", - className)); - return TCL_ERROR; - } - - /* - * Try to create the specified class and its namespace. - */ - /* need the workaround with infoPtr->currClassFlags to keep the stubs - * call interface compatible! - */ - infoPtr->currClassFlags = flags; - if (Itcl_CreateClass(interp, className, infoPtr, &iclsPtr) != TCL_OK) { - infoPtr->currClassFlags = 0; - return TCL_ERROR; - } - infoPtr->currClassFlags = 0; - iclsPtr->flags = flags; - - /* - * Import the built-in commands from the itcl::builtin namespace. - * Do this before parsing the class definition, so methods/procs - * can override the built-in commands. - */ - result = Tcl_Import(interp, iclsPtr->nsPtr, "::itcl::builtin::*", - /* allowOverwrite */ 1); - ooNs = Tcl_GetObjectNamespace(iclsPtr->oPtr); - if ( result == TCL_OK && ooNs != iclsPtr->nsPtr) { - result = Tcl_Import(interp, ooNs, "::itcl::builtin::*", 1); - } - - if (result != TCL_OK) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while installing built-in commands for class \"%s\")", - className)); - goto errorReturn; - } - - /* - * Push this class onto the class definition stack so that it - * becomes the current context for all commands in the parser. - * Activate the parser and evaluate the class definition. - */ - Itcl_PushStack((ClientData)iclsPtr, &infoPtr->clsStack); - - result = Itcl_PushCallFrame(interp, &frame, parserNs, - /* isProcCallFrame */ 0); - - Itcl_SetCallFrameResolver(interp, iclsPtr->resolvePtr); - if (result == TCL_OK) { - result = Tcl_EvalObjEx(interp, objv[2], 0); - Itcl_PopCallFrame(interp); - } - Itcl_PopStack(&infoPtr->clsStack); - - noCleanup = 0; - if (result != TCL_OK) { - Tcl_Obj *options = Tcl_GetReturnOptions(interp, result); - Tcl_Obj *key = Tcl_NewStringObj("-errorline", -1); - Tcl_Obj *stackTrace = NULL; - - Tcl_IncrRefCount(key); - Tcl_DictObjGet(NULL, options, key, &stackTrace); - Tcl_DecrRefCount(key); - if (stackTrace == NULL) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n error while parsing class \"%s\" body %s", - className, Tcl_GetString(objv[2]))); - noCleanup = 1; - } else { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (class \"%s\" body line %s)", - className, Tcl_GetString(stackTrace))); - } - result = TCL_ERROR; - goto errorReturn; - } - - if (Itcl_FirstListElem(&iclsPtr->bases) == NULL) { - /* No [inherit]. Use default inheritance root. */ - Tcl_Obj *cmdPtr = Tcl_NewListObj(4, NULL); - - Tcl_ListObjAppendElement(NULL, cmdPtr, - Tcl_NewStringObj("::oo::define", -1)); - Tcl_ListObjAppendElement(NULL, cmdPtr, iclsPtr->fullNamePtr); - Tcl_ListObjAppendElement(NULL, cmdPtr, - Tcl_NewStringObj("superclass", -1)); - Tcl_ListObjAppendElement(NULL, cmdPtr, - Tcl_NewStringObj("::itcl::Root", -1)); - - Tcl_IncrRefCount(cmdPtr); - result = Tcl_EvalObj(interp, cmdPtr); - Tcl_DecrRefCount(cmdPtr); - if (result == TCL_ERROR) { - goto errorReturn; - } - } - - /* - * At this point, parsing of the class definition has succeeded. - * Add built-in methods such as "configure" and "cget"--as long - * as they don't conflict with those defined in the class. - */ - if (Itcl_InstallBiMethods(interp, iclsPtr) != TCL_OK) { - result = TCL_ERROR; - goto errorReturn; - } - - /* - * Build the name resolution tables for all data members. - */ - Itcl_BuildVirtualTables(iclsPtr); - - /* make the methods and procs known to TclOO */ - FOREACH_HASH_VALUE(imPtr, &iclsPtr->functions) { - ClientData pmPtr; - argumentPtr = imPtr->codePtr->argumentPtr; - bodyPtr = imPtr->codePtr->bodyPtr; - -if (imPtr->codePtr->flags & ITCL_IMPLEMENT_OBJCMD) { - /* Implementation of this member is coded in C expecting Tcl_Obj */ - - imPtr->tmPtr = Tcl_NewMethod(interp, iclsPtr->clsPtr, imPtr->namePtr, - 1, &itclObjMethodType, (ClientData) imPtr); - ItclPreserveIMF(imPtr); - - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - imPtr->tmPtr = Tcl_NewInstanceMethod(interp, iclsPtr->oPtr, - imPtr->namePtr, 1, &itclObjMethodType, (ClientData) imPtr); - ItclPreserveIMF(imPtr); - } - -} else if (imPtr->codePtr->flags & ITCL_IMPLEMENT_ARGCMD) { - /* Implementation of this member is coded in C expecting (char *) */ - - imPtr->tmPtr = Tcl_NewMethod(interp, iclsPtr->clsPtr, imPtr->namePtr, - 1, &itclArgMethodType, (ClientData) imPtr); - - ItclPreserveIMF(imPtr); - - - -} else { - if (imPtr->codePtr->flags & ITCL_BUILTIN) { - int isDone; - isDone = 0; - if (imPtr->builtinArgumentPtr == NULL) { -/* FIXME next lines are possibly a MEMORY leak not really sure!! */ - argumentPtr = Tcl_NewStringObj("args", -1); - imPtr->builtinArgumentPtr = argumentPtr; - Tcl_IncrRefCount(imPtr->builtinArgumentPtr); - } else { - argumentPtr = imPtr->builtinArgumentPtr; - } - bodyPtr = Tcl_NewStringObj("return [", -1); - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-cget") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::cget", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-configure") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::configure", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-isa") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::isa", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-createhull") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::createhull", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-keepcomponentoption") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::keepcomponentoption", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-ignorecomponentoption") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::ignorercomponentoption", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-renamecomponentoption") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::renamecomponentoption", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-keepoptioncomponent") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::keepoptioncomponent", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-ignoreoptioncomponent") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::ignoreoptioncomponent", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-renameoptioncomponent") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::renameoptioncomponent", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-setupcomponent") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::setupcomponent", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-initoptions") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::initoptions", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-getinstancevar") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::getinstancevar", - -1); - isDone = 1; - } - if (iclsPtr->flags & - (ITCL_TYPE|ITCL_WIDGETADAPTOR| - ITCL_WIDGET|ITCL_ECLASS)) { - /* now the builtin stuff for snit functionality */ - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-mytypemethod") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::mytypemethod", - -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-mymethod") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::mymethod", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-myvar") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::myvar", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-mytypevar") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::mytypevar", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-itcl_hull") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::itcl_hull", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-callinstance") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::callinstance", - -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-myproc") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::myproc", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-installhull") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::installhull", - -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-installcomponent") == 0) { - Tcl_AppendToObj(bodyPtr, - "::itcl::builtin::installcomponent", -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-classunknown") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::classunknown", - -1); - isDone = 1; - } - if (strcmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-destroy") == 0) { - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::destroy", -1); - isDone = 1; - } - } - if (strncmp(Tcl_GetString(imPtr->codePtr->bodyPtr), - "@itcl-builtin-setget", 20) == 0) { - char *cp = Tcl_GetString(imPtr->codePtr->bodyPtr)+20; - Tcl_AppendToObj(bodyPtr, "::itcl::builtin::setget ", -1); - Tcl_AppendToObj(bodyPtr, cp, -1); - Tcl_AppendToObj(bodyPtr, " ", 1); - isDone = 1; - } - if (!isDone) { - Tcl_AppendToObj(bodyPtr, - Tcl_GetString(imPtr->codePtr->bodyPtr), -1); - } - Tcl_AppendToObj(bodyPtr, " {*}$args]", -1); - } - imPtr->tmPtr = (ClientData)Itcl_NewProcClassMethod(interp, - iclsPtr->clsPtr, ItclCheckCallMethod, ItclAfterCallMethod, - ItclProcErrorProc, imPtr, imPtr->namePtr, argumentPtr, - bodyPtr, &pmPtr); - hPtr2 = Tcl_CreateHashEntry(&iclsPtr->infoPtr->procMethods, - (char *)imPtr->tmPtr, &isNewEntry); - if (isNewEntry) { - Tcl_SetHashValue(hPtr2, imPtr); - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - if (argumentPtr == NULL) { - argumentPtr = iclsPtr->infoPtr->typeDestructorArgumentPtr; - imPtr->codePtr->argumentPtr = argumentPtr; - Tcl_IncrRefCount(argumentPtr); - } - /* - * We're overwriting the tmPtr field, so yank out the - * entry in the procMethods map based on the old one. - */ - if (isNewEntry) { - Tcl_DeleteHashEntry(hPtr2); - } - imPtr->tmPtr = (ClientData)Itcl_NewProcMethod(interp, - iclsPtr->oPtr, ItclCheckCallMethod, ItclAfterCallMethod, - ItclProcErrorProc, imPtr, imPtr->namePtr, argumentPtr, - bodyPtr, &pmPtr); - } -} - if ((imPtr->flags & ITCL_COMMON) == 0) { - imPtr->accessCmd = Tcl_CreateObjCommand(interp, - Tcl_GetString(imPtr->fullNamePtr), - Itcl_ExecMethod, imPtr, ItclReleaseIMF); - ItclPreserveIMF(imPtr); - } else { - imPtr->accessCmd = Tcl_CreateObjCommand(interp, - Tcl_GetString(imPtr->fullNamePtr), - Itcl_ExecProc, imPtr, ItclReleaseIMF); - ItclPreserveIMF(imPtr); - } - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - /* initialize the typecomponents and typevariables */ - if (Itcl_PushCallFrame(interp, &frame, iclsPtr->nsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - result = TCL_ERROR; - goto errorReturn; - } - FOREACH_HASH_VALUE(ivPtr, &iclsPtr->variables) { - if ((ivPtr->flags & ITCL_COMMON) && (ivPtr->init != NULL)) { - if (Tcl_SetVar2(interp, Tcl_GetString(ivPtr->namePtr), NULL, - Tcl_GetString(ivPtr->init), - TCL_NAMESPACE_ONLY) == NULL) { - Itcl_PopCallFrame(interp); - result = TCL_ERROR; - goto errorReturn; - } - } - } - Itcl_PopCallFrame(interp); - } - if (iclsPtr->typeConstructorPtr != NULL) { - /* call the typeconstructor body */ - if (Itcl_PushCallFrame(interp, &frame, iclsPtr->nsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - result = TCL_ERROR; - goto errorReturn; - } - result = Tcl_EvalObjEx(interp, iclsPtr->typeConstructorPtr, - TCL_EVAL_DIRECT); - Itcl_PopCallFrame(interp); - if (result != TCL_OK) { - goto errorReturn; - } - } - result = TCL_OK; - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - if (ItclCheckForInitializedComponents(interp, iclsPtr, NULL) != - TCL_OK) { - result = TCL_ERROR; - goto errorReturn; - } - } - - if (result == TCL_OK) { - Tcl_ResetResult(interp); - } - if (iclsPtrPtr != NULL) { - *iclsPtrPtr = iclsPtr; - } - ItclAddClassesDictInfo(interp, iclsPtr); - return result; -errorReturn: - if (!noCleanup) { - Tcl_DeleteNamespace(iclsPtr->nsPtr); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * ItclCheckForInitializedComponents() - * - * check if all components for delegation exist and are initialized - * ------------------------------------------------------------------------ - */ -int -ItclCheckForInitializedComponents( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclObject *ioPtr) -{ - FOREACH_HASH_DECLS; - Tcl_CallFrame frame; - Tcl_DString buffer; - ItclDelegatedFunction *idmPtr; - int result; - int doCheck; - - result = TCL_OK; - /* check if the typecomponents are initialized */ - if (Itcl_PushCallFrame(interp, &frame, iclsPtr->nsPtr, - /*isProcCallFrame*/0) != TCL_OK) { - return TCL_ERROR; - } - idmPtr = NULL; - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - const char *val; - /* check here for delegated typemethods only - * rest is done in ItclCreateObject - */ - doCheck = 1; - if (ioPtr == NULL) { - if (!(idmPtr->flags & ITCL_TYPE_METHOD)) { - doCheck = 0; - ioPtr = iclsPtr->infoPtr->currIoPtr; - } - } - if (doCheck) { - if (idmPtr->icPtr != NULL) { - if (idmPtr->icPtr->ivPtr->flags & ITCL_COMMON) { - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj(ITCL_VARIABLES_NAMESPACE, -1); - Tcl_AppendToObj(objPtr, (Tcl_GetObjectNamespace( - idmPtr->icPtr->ivPtr->iclsPtr->oPtr))->fullName, - -1); - Tcl_AppendToObj(objPtr, "::", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString( - idmPtr->icPtr->ivPtr->namePtr), -1); - val = Tcl_GetVar2(interp, Tcl_GetString(objPtr), NULL, 0); - Tcl_DecrRefCount(objPtr); - } else { - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, - Tcl_GetString(ioPtr->varNsNamePtr), -1); - Tcl_DStringAppend(&buffer, - Tcl_GetString(idmPtr->icPtr->ivPtr->fullNamePtr), - -1); - val = Tcl_GetVar2(interp, Tcl_DStringValue(&buffer), - NULL, 0); - Tcl_DStringFree(&buffer); - } - if ((ioPtr != NULL) && ((val != NULL) && (strlen(val) == 0))) { - val = ItclGetInstanceVar( - ioPtr->iclsPtr->interp, - "itcl_hull", NULL, ioPtr, - iclsPtr); - } - if ((val == NULL) || (strlen(val) == 0)) { - if (iclsPtr->flags & ITCL_WIDGETADAPTOR) { - if (strcmp (Tcl_GetString(idmPtr->icPtr->namePtr), - "itcl_hull") == 0) { - /* maybe that will be initialized in constructor - * later on */ - continue; - } - } - result = TCL_ERROR; - break; - } - } - } - } - Itcl_PopCallFrame(interp); - if (result == TCL_ERROR) { - const char *startStr; - const char *sepStr; - const char *objectStr; - startStr = ""; - sepStr = ""; - objectStr = ""; - if (ioPtr != NULL) { - sepStr = " "; - objectStr = Tcl_GetString(ioPtr->origNamePtr); - } - if (idmPtr->flags & ITCL_TYPE_METHOD) { - startStr = "type"; - } - /* FIXME there somtimes is a message for widgetadaptor: - * can't read "itcl_hull": no such variable - * have to check why - */ - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, Tcl_GetString(iclsPtr->fullNamePtr), - sepStr, objectStr, " delegates ", startStr, "method \"", - Tcl_GetString(idmPtr->namePtr), - "\" to undefined ", startStr, "component \"", - Tcl_GetString(idmPtr->icPtr->ivPtr->namePtr), "\"", NULL); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassInheritCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "inherit" command is invoked to define one or more base classes. - * Handles the following syntax: - * - * inherit <baseclass> ?<baseclass>...? - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassInheritCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - int result; - int i; - int newEntry; - int haveClasses; - const char *token; - Itcl_ListElem *elem; - Itcl_ListElem *elem2; - ItclClass *cdPtr; - ItclClass *baseClsPtr; - ItclClass *badCdPtr; - ItclHierIter hier; - Itcl_Stack stack; - Tcl_CallFrame frame; - Tcl_DString buffer; - - ItclShowArgs(2, "Itcl_InheritCmd", objc, objv); - - if (objc < 2) { - Tcl_WrongNumArgs(interp, 1, objv, "class ?class...?"); - return TCL_ERROR; - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::inherit called from", - " not within a class", NULL); - return TCL_ERROR; - } - /* - * An "inherit" statement can only be included once in a - * class definition. - */ - elem = Itcl_FirstListElem(&iclsPtr->bases); - if (elem != NULL) { - Tcl_AppendToObj(Tcl_GetObjResult(interp), "inheritance \"", -1); - - while (elem) { - cdPtr = (ItclClass*)Itcl_GetListValue(elem); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - Tcl_GetString(cdPtr->namePtr), " ", (char*)NULL); - - elem = Itcl_NextListElem(elem); - } - - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\" already defined for class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * Validate each base class and add it to the "bases" list. - */ - result = Itcl_PushCallFrame(interp, &frame, iclsPtr->nsPtr->parentPtr, - /* isProcCallFrame */ 0); - - if (result != TCL_OK) { - return TCL_ERROR; - } - - for (objc--,objv++; objc > 0; objc--,objv++) { - - /* - * Make sure that the base class name is known in the - * parent namespace (currently active). If not, try - * to autoload its definition. - */ - token = Tcl_GetString(*objv); - baseClsPtr = Itcl_FindClass(interp, token, /* autoload */ 1); - if (!baseClsPtr) { - Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); - int errlen; - char *errmsg; - - Tcl_IncrRefCount(resultPtr); - errmsg = Tcl_GetStringFromObj(resultPtr, &errlen); - - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot inherit from \"", token, "\"", - (char*)NULL); - - if (errlen > 0) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - " (", errmsg, ")", (char*)NULL); - } - Tcl_DecrRefCount(resultPtr); - goto inheritError; - } - - /* - * Make sure that the base class is not the same as the - * class that is being built. - */ - if (baseClsPtr == iclsPtr) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "class \"", Tcl_GetString(iclsPtr->namePtr), - "\" cannot inherit from itself", - (char*)NULL); - goto inheritError; - } - - Itcl_AppendList(&iclsPtr->bases, (ClientData)baseClsPtr); - ItclPreserveClass(baseClsPtr); - } - - /* - * Scan through the inheritance list to make sure that no - * class appears twice. - */ - elem = Itcl_FirstListElem(&iclsPtr->bases); - while (elem) { - elem2 = Itcl_NextListElem(elem); - while (elem2) { - if (Itcl_GetListValue(elem) == Itcl_GetListValue(elem2)) { - cdPtr = (ItclClass*)Itcl_GetListValue(elem); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "class \"", iclsPtr->fullNamePtr, - "\" cannot inherit base class \"", - cdPtr->fullNamePtr, "\" more than once", - (char*)NULL); - goto inheritError; - } - elem2 = Itcl_NextListElem(elem2); - } - elem = Itcl_NextListElem(elem); - } - - /* - * Add each base class and all of its base classes into - * the heritage for the current class. Along the way, make - * sure that no class appears twice in the heritage. - */ - Itcl_InitHierIter(&hier, iclsPtr); - cdPtr = Itcl_AdvanceHierIter(&hier); /* skip the class itself */ - cdPtr = Itcl_AdvanceHierIter(&hier); - while (cdPtr != NULL) { - (void) Tcl_CreateHashEntry(&iclsPtr->heritage, - (char*)cdPtr, &newEntry); - - if (!newEntry) { - break; - } - cdPtr = Itcl_AdvanceHierIter(&hier); - } - Itcl_DeleteHierIter(&hier); - - /* - * Same base class found twice in the hierarchy? - * Then flag error. Show the list of multiple paths - * leading to the same base class. - */ - if (!newEntry) { - Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); - - badCdPtr = cdPtr; - Tcl_AppendStringsToObj(resultPtr, - "class \"", Tcl_GetString(iclsPtr->fullNamePtr), - "\" inherits base class \"", - Tcl_GetString(badCdPtr->fullNamePtr), "\" more than once:", - (char*)NULL); - - cdPtr = iclsPtr; - Itcl_InitStack(&stack); - Itcl_PushStack((ClientData)cdPtr, &stack); - - /* - * Show paths leading to bad base class - */ - while (Itcl_GetStackSize(&stack) > 0) { - cdPtr = (ItclClass*)Itcl_PopStack(&stack); - - if (cdPtr == badCdPtr) { - Tcl_AppendToObj(resultPtr, "\n ", -1); - for (i=0; i < Itcl_GetStackSize(&stack); i++) { - if (Itcl_GetStackValue(&stack, i) == NULL) { - cdPtr = (ItclClass*)Itcl_GetStackValue(&stack, i-1); - Tcl_AppendStringsToObj(resultPtr, - Tcl_GetString(cdPtr->namePtr), "->", - (char*)NULL); - } - } - Tcl_AppendToObj(resultPtr, - Tcl_GetString(badCdPtr->namePtr), -1); - } - else if (!cdPtr) { - (void)Itcl_PopStack(&stack); - } - else { - elem = Itcl_LastListElem(&cdPtr->bases); - if (elem) { - Itcl_PushStack((ClientData)cdPtr, &stack); - Itcl_PushStack((ClientData)NULL, &stack); - while (elem) { - Itcl_PushStack(Itcl_GetListValue(elem), &stack); - elem = Itcl_PrevListElem(elem); - } - } - } - } - Itcl_DeleteStack(&stack); - goto inheritError; - } - - /* - * At this point, everything looks good. - * Finish the installation of the base classes. Update - * each base class to recognize the current class as a - * derived class. - */ - Tcl_DStringInit(&buffer); - haveClasses = 0; - elem = Itcl_FirstListElem(&iclsPtr->bases); - Tcl_DStringAppend(&buffer, "::oo::define ", -1); - Tcl_DStringAppend(&buffer, Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_DStringAppend(&buffer, " superclass", -1); - while (elem) { - baseClsPtr = (ItclClass*)Itcl_GetListValue(elem); - haveClasses++; - Tcl_DStringAppend(&buffer, " ", -1); - Tcl_DStringAppend(&buffer, Tcl_GetString(baseClsPtr->fullNamePtr), -1); - - Itcl_AppendList(&baseClsPtr->derived, (ClientData)iclsPtr); - ItclPreserveClass(iclsPtr); - - elem = Itcl_NextListElem(elem); - } - Itcl_PopCallFrame(interp); - if (haveClasses) { - result = Tcl_EvalEx(interp, Tcl_DStringValue(&buffer), -1, 0); - } - Tcl_DStringFree(&buffer); - - return result; - - - /* - * If the "inherit" list cannot be built properly, tear it - * down and return an error. - */ -inheritError: - Itcl_PopCallFrame(interp); - - elem = Itcl_FirstListElem(&iclsPtr->bases); - while (elem) { - ItclReleaseClass( (ItclClass *)Itcl_GetListValue(elem) ); - elem = Itcl_DeleteListElem(elem); - } - return TCL_ERROR; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassProtectionCmd() - * - * Invoked by Tcl whenever the user issues a protection setting - * command like "public" or "private". Creates commands and - * variables, and assigns a protection level to them. Protection - * levels are defined as follows: - * - * public => accessible from any namespace - * protected => accessible from selected namespaces - * private => accessible only in the namespace where it was defined - * - * Handles the following syntax: - * - * public <command> ?<arg> <arg>...? - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassProtectionCmd( - ClientData clientData, /* protection level (public/protected/private) */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ProtectionCmdInfo *pInfo = (ProtectionCmdInfo*)clientData; - int result; - int oldLevel; - - ItclShowArgs(2, "Itcl_ClassProtectionCmd", objc, objv); - - if (objc < 2) { - Tcl_WrongNumArgs(interp, 1, objv, "command ?arg arg...?"); - return TCL_ERROR; - } - - oldLevel = Itcl_Protection(interp, pInfo->pLevel); - - if (objc == 2) { - /* something like: public { variable a; variable b } */ - result = Tcl_EvalObjEx(interp, objv[1], 0); - } else { - /* something like: public variable a 123 456 */ - result = Itcl_EvalArgs(interp, objc-1, objv+1); - if (result == TCL_ERROR) { - Tcl_ResetResult(interp); - Tcl_WrongNumArgs(interp, 1, objv, "command ?arg arg...? or wrong command name"); - return TCL_ERROR; - } - } - - if (result == TCL_BREAK) { - Tcl_SetResult(interp, "invoked \"break\" outside of a loop", - TCL_STATIC); - result = TCL_ERROR; - } else { - if (result == TCL_CONTINUE) { - Tcl_SetResult(interp, "invoked \"continue\" outside of a loop", - TCL_STATIC); - result = TCL_ERROR; - } else { - if (result != TCL_OK) { - Tcl_Obj *options = Tcl_GetReturnOptions(interp, result); - Tcl_Obj *key = Tcl_NewStringObj("-errorline", -1); - Tcl_Obj *stackTrace = NULL; - - Tcl_IncrRefCount(key); - Tcl_DictObjGet(NULL, options, key, &stackTrace); - Tcl_DecrRefCount(key); - if (stackTrace == NULL) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n error while parsing class \"%s\"", - Tcl_GetString(objv[0]))); - } else { - char *token = Tcl_GetString(objv[0]); - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (%.100s body line %s)", - token, Tcl_GetString(stackTrace))); - } - } - } - } - - Itcl_Protection(interp, oldLevel); - return result; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassConstructorCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "constructor" command is invoked to define the constructor - * for an object. Handles the following syntax: - * - * constructor <arglist> ?<init>? <body> - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassConstructorCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - Tcl_Obj *namePtr; - char *arglist; - char *body; - - ItclShowArgs(2, "Itcl_ClassConstructorCmd", objc, objv); - - if (objc < 3 || objc > 4) { - Tcl_WrongNumArgs(interp, 1, objv, "args ?init? body"); - return TCL_ERROR; - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::constructor called from", - " not within a class", NULL); - return TCL_ERROR; - } - namePtr = objv[0]; - if (Tcl_FindHashEntry(&iclsPtr->functions, (char *)objv[0])) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", Tcl_GetString(namePtr), "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - /* - * If there is an object initialization statement, pick this - * out and take the last argument as the constructor body. - */ - arglist = Tcl_GetString(objv[1]); - if (objc == 3) { - body = Tcl_GetString(objv[2]); - } else { - iclsPtr->initCode = objv[2]; - Tcl_IncrRefCount(iclsPtr->initCode); - body = Tcl_GetString(objv[3]); - } - - if (Itcl_CreateMethod(interp, iclsPtr, namePtr, arglist, body) != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassDestructorCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "destructor" command is invoked to define the destructor - * for an object. Handles the following syntax: - * - * destructor <body> - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassDestructorCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - Tcl_Obj *namePtr; - char *body; - - ItclShowArgs(2, "Itcl_ClassDestructorCmd", objc, objv); - - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "body"); - return TCL_ERROR; - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::destructor called from", - " not within a class", NULL); - return TCL_ERROR; - } - namePtr = objv[0]; - body = Tcl_GetString(objv[1]); - - if (Tcl_FindHashEntry(&iclsPtr->functions, (char *)namePtr)) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", Tcl_GetString(namePtr), "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - if (Itcl_CreateMethod(interp, iclsPtr, namePtr, (char*)NULL, body) - != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassMethodCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "method" command is invoked to define an object method. - * Handles the following syntax: - * - * method <name> ?<arglist>? ?<body>? - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassMethodCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *namePtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - char *arglist; - char *body; - - ItclShowArgs(2, "Itcl_ClassMethodCmd", objc, objv); - - if (objc < 2 || objc > 4) { - Tcl_WrongNumArgs(interp, 1, objv, "name ?args? ?body?"); - return TCL_ERROR; - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::method called from", - " not within a class", NULL); - return TCL_ERROR; - } - namePtr = objv[1]; - - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, (char *)objv[1]); - if (hPtr != NULL) { - Tcl_AppendResult(interp, "method \"", Tcl_GetString(namePtr), - "\" has been delegated", NULL); - return TCL_ERROR; - } - arglist = NULL; - body = NULL; - if (objc >= 3) { - arglist = Tcl_GetString(objv[2]); - } - if (objc >= 4) { - body = Tcl_GetString(objv[3]); - } - - if (Itcl_CreateMethod(interp, iclsPtr, namePtr, arglist, body) != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassProcCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "proc" command is invoked to define a common class proc. - * A "proc" is like a "method", but only has access to "common" - * class variables. Handles the following syntax: - * - * proc <name> ?<arglist>? ?<body>? - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassProcCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *namePtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - char *arglist; - char *body; - - ItclShowArgs(1, "Itcl_ClassProcCmd", objc, objv); - - if (objc < 2 || objc > 4) { - Tcl_WrongNumArgs(interp, 1, objv, "name ?args? ?body?"); - return TCL_ERROR; - } - - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - namePtr = objv[1]; - - arglist = NULL; - body = NULL; - if (objc >= 3) { - arglist = Tcl_GetString(objv[2]); - } - if (objc >= 4) { - body = Tcl_GetString(objv[3]); - } - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::proc called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - const char *name = Tcl_GetString(namePtr); - /* check if the typemethod is already delegated */ - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(Tcl_GetString(idmPtr->namePtr), name) == 0) { - Tcl_AppendResult(interp, "Error in \"typemethod ", name, - "...\", \"", name, "\" has been delegated", NULL); - return TCL_ERROR; - } - } - } - if (Itcl_CreateProc(interp, iclsPtr, namePtr, arglist, body) != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassTypeMethodCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "proc" command is invoked to define a common class proc. - * A "proc" is like a "method", but only has access to "common" - * class variables. Handles the following syntax: - * - * typemethod <name> ?<arglist>? ?<body>? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassTypeMethodCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - FOREACH_HASH_DECLS; - Tcl_Obj *namePtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - char *arglist; - char *body; - ItclMemberFunc *imPtr; - - ItclShowArgs(1, "Itcl_ClassTypeMethodCmd", objc, objv); - - if (objc < 2 || objc > 4) { - Tcl_WrongNumArgs(interp, 1, objv, "name ?args? ?body?"); - return TCL_ERROR; - } - - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::typemethod called from", - " not within a class", NULL); - return TCL_ERROR; - } - namePtr = objv[1]; - - arglist = NULL; - body = NULL; - if (objc >= 3) { - arglist = Tcl_GetString(objv[2]); - } - if (objc >= 4) { - body = Tcl_GetString(objv[3]); - } - - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - const char *name = Tcl_GetString(namePtr); - /* check if the typemethod is already delegated */ - FOREACH_HASH_VALUE(idmPtr, &iclsPtr->delegatedFunctions) { - if (strcmp(Tcl_GetString(idmPtr->namePtr), name) == 0) { - Tcl_AppendResult(interp, "Error in \"typemethod ", name, - "...\", \"", name, "\" has been delegated", NULL); - return TCL_ERROR; - } - } - } - iclsPtr->infoPtr->functionFlags = ITCL_TYPE_METHOD; - if (Itcl_CreateProc(interp, iclsPtr, namePtr, arglist, body) != TCL_OK) { - iclsPtr->infoPtr->functionFlags = 0; - return TCL_ERROR; - } - iclsPtr->infoPtr->functionFlags = 0; - hPtr = Tcl_FindHashEntry(&iclsPtr->functions, (char *)namePtr); - imPtr = Tcl_GetHashValue(hPtr); - imPtr->flags |= ITCL_TYPE_METHOD; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassVariableCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "variable" command is invoked to define an instance variable. - * Handles the following syntax: - * - * variable <varname> ?<init>? ?<config>? - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassVariableCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *namePtr; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - ItclVariable *ivPtr; - char *init; - char *config; - char *arrayInitStr; - const char *usageStr; - int pLevel; - int haveError; - int haveArrayInit; - int result; - - result = TCL_OK; - haveError = 0; - haveArrayInit = 0; - usageStr = NULL; - arrayInitStr = NULL; - ItclShowArgs(1, "Itcl_ClassVariableCmd", objc, objv); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::variable called from", - " not within a class", NULL); - return TCL_ERROR; - } - pLevel = Itcl_Protection(interp, 0); - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - if (objc > 2) { - if (strcmp(Tcl_GetString(objv[2]), "-array") == 0) { - if (objc == 4) { - arrayInitStr = Tcl_GetString(objv[3]); - haveArrayInit = 1; - } else { - haveError = 1; - usageStr = "varname ?init|-array init?"; - } - } - } - } - if (!haveError && !haveArrayInit) { - if (pLevel == ITCL_PUBLIC) { - if (objc < 2 || objc > 4) { - usageStr = "name ?init? ?config?"; - haveError = 1; - } - } else { - if ((objc < 2) || (objc > 3)) { - usageStr = "name ?init?"; - haveError = 1; - } - } - } - - if (haveError) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - /* - * Make sure that the variable name does not contain anything - * goofy like a "::" scope qualifier. - */ - namePtr = objv[1]; - if (strstr(Tcl_GetString(namePtr), "::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad variable name \"", Tcl_GetString(namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - init = NULL; - config = NULL; - if (!haveArrayInit) { - if (objc >= 3) { - init = Tcl_GetString(objv[2]); - } - if (objc >= 4) { - config = Tcl_GetString(objv[3]); - } - } - - if (Itcl_CreateVariable(interp, iclsPtr, namePtr, init, config, - &ivPtr) != TCL_OK) { - return TCL_ERROR; - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - ivPtr->flags |= ITCL_VARIABLE; - } - if (haveArrayInit) { - ivPtr->arrayInitPtr = Tcl_NewStringObj(arrayInitStr, -1); - Tcl_IncrRefCount(ivPtr->arrayInitPtr); - } else { - ivPtr->arrayInitPtr = NULL; - } - iclsPtr->numVariables++; - ItclAddClassVariableDictInfo(interp, iclsPtr, ivPtr); - return result; -} - - -/* - * ------------------------------------------------------------------------ - * ItclInitClassCommon() - * - * initialize a class commen variable - * - * ------------------------------------------------------------------------ - */ -static int -ItclInitClassCommon( - Tcl_Interp *interp, - ItclClass *iclsPtr, - ItclVariable *ivPtr, - const char *initStr) -{ - Tcl_DString buffer; - Tcl_CallFrame frame; - Tcl_Namespace *commonNsPtr; - Tcl_HashEntry *hPtr; - Tcl_Var varPtr; - int result; - int isNew; - - result = TCL_OK; - ivPtr->flags |= ITCL_COMMON; - iclsPtr->numCommons++; - - /* - * Create the variable in the namespace associated with the - * class. Do this the hard way, to avoid the variable resolver - * procedures. These procedures won't work until we rebuild - * the virtual tables below. - */ - Tcl_DStringInit(&buffer); - if (ivPtr->protection != ITCL_PUBLIC) { - /* public commons go to the class namespace directly the others - * go to the variables namespace of the class */ - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - } - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(ivPtr->iclsPtr->oPtr))->fullName, -1); - commonNsPtr = Tcl_FindNamespace(interp, Tcl_DStringValue(&buffer), NULL, 0); - if (commonNsPtr == NULL) { - Tcl_AppendResult(interp, "ITCL: cannot find common variables namespace", - " for class \"", Tcl_GetString(ivPtr->iclsPtr->fullNamePtr), - "\"", NULL); - return TCL_ERROR; - } - varPtr = Tcl_NewNamespaceVar(interp, commonNsPtr, - Tcl_GetString(ivPtr->namePtr)); - hPtr = Tcl_CreateHashEntry(&iclsPtr->classCommons, (char *)ivPtr, - &isNew); - if (isNew) { - Itcl_PreserveVar(varPtr); - Tcl_SetHashValue(hPtr, varPtr); - } - result = Itcl_PushCallFrame(interp, &frame, commonNsPtr, - /* isProcCallFrame */ 0); - Itcl_PopCallFrame(interp); - - /* - * TRICKY NOTE: Make sure to rebuild the virtual tables for this - * class so that this variable is ready to access. The variable - * resolver for the parser namespace needs this info to find the - * variable if the developer tries to set it within the class - * definition. - * - * If an initialization value was specified, then initialize - * the variable now. - */ - Itcl_BuildVirtualTables(iclsPtr); - - if (initStr != NULL) { - const char *val; - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, Tcl_GetString(ivPtr->namePtr), -1); - val = Tcl_SetVar(interp, - Tcl_DStringValue(&buffer), initStr, - TCL_NAMESPACE_ONLY); - - if (!val) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot initialize common variable \"", - Tcl_GetString(ivPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - } - if (ivPtr->arrayInitPtr != NULL) { - int i; - int argc; - const char **argv; - const char *val; - Tcl_DStringAppend(&buffer, "::", -1); - Tcl_DStringAppend(&buffer, Tcl_GetString(ivPtr->namePtr), -1); - result = Tcl_SplitList(interp, Tcl_GetString(ivPtr->arrayInitPtr), - &argc, &argv); - for (i = 0; i < argc; i++) { - val = Tcl_SetVar2(interp, Tcl_DStringValue(&buffer), argv[i], - argv[i + 1], TCL_NAMESPACE_ONLY); - if (!val) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "cannot initialize common variable \"", - Tcl_GetString(ivPtr->namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - i++; - } - ckfree((char *)argv); - } - Tcl_DStringFree(&buffer); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCommonCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "common" command is invoked to define a variable that is - * common to all objects in the class. Handles the following syntax: - * - * common <varname> ?<init>? - * - * ------------------------------------------------------------------------ - */ -static int -ItclClassCommonCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[], /* argument objects */ - int protection, - ItclVariable **ivPtrPtr) -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - ItclVariable *ivPtr; - Tcl_Obj *namePtr; - char *arrayInitStr; - const char *usageStr; - char *initStr; - int haveError; - int haveArrayInit; - int result; - - result = TCL_OK; - haveError = 0; - haveArrayInit = 0; - usageStr = NULL; - arrayInitStr = NULL; - *ivPtrPtr = NULL; - ItclShowArgs(2, "Itcl_ClassCommonCmd", objc, objv); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::common called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGETADAPTOR)) { - if (objc > 2) { - if (strcmp(Tcl_GetString(objv[2]), "-array") == 0) { - if (objc == 4) { - arrayInitStr = Tcl_GetString(objv[3]); - haveArrayInit = 1; - } else { - haveError = 1; - usageStr = "varname ?init|-array init?"; - } - } - } - } - if (!haveError && !haveArrayInit) { - if ((objc < 2) || (objc > 3)) { - usageStr = "varname ?init?"; - haveError = 1; - } - } - if (haveError) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - /* - * Make sure that the variable name does not contain anything - * goofy like a "::" scope qualifier. - */ - namePtr = objv[1]; - if (strstr(Tcl_GetString(namePtr), "::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad variable name \"", Tcl_GetString(namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - initStr = NULL; - if (!haveArrayInit) { - if (objc >= 3) { - initStr = Tcl_GetString(objv[2]); - } - } - - if (Itcl_CreateVariable(interp, iclsPtr, namePtr, initStr, (char*)NULL, - &ivPtr) != TCL_OK) { - return TCL_ERROR; - } - if (protection != 0) { - ivPtr->protection = protection; - } - if (haveArrayInit) { - ivPtr->arrayInitPtr = Tcl_NewStringObj(arrayInitStr, -1); - Tcl_IncrRefCount(ivPtr->arrayInitPtr); - } else { - ivPtr->arrayInitPtr = NULL; - } - *ivPtrPtr = ivPtr; - result = ItclInitClassCommon(interp, iclsPtr, ivPtr, initStr); - ItclAddClassVariableDictInfo(interp, iclsPtr, ivPtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassTypeVariableCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "typevariable" command is invoked to define a variable that is - * common to all objects in the class. Handles the following syntax: - * - * typevariable <varname> ?<init>? - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassTypeVariableCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclVariable *ivPtr; - int result; - - ivPtr = NULL; - ItclShowArgs(1, "Itcl_ClassTypeVariableCmd", objc, objv); - result = ItclClassCommonCmd(clientData, interp, objc, objv, ITCL_PUBLIC, - &ivPtr); - if (ivPtr != NULL) { - ivPtr->flags |= ITCL_TYPE_VARIABLE; - ItclAddClassVariableDictInfo(interp, ivPtr->iclsPtr, ivPtr); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCommonCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "common" command is invoked to define a variable that is - * common to all objects in the class. Handles the following syntax: - * - * common <varname> ?<init>? - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCommonCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclVariable *ivPtr; - - ItclShowArgs(2, "Itcl_ClassTypeVariableCmd", objc, objv); - return ItclClassCommonCmd(clientData, interp, objc, objv, 0, &ivPtr); -} - - -/* - * ------------------------------------------------------------------------ - * ItclFreeParserCommandData() - * - * This callback will free() up memory dynamically allocated - * and passed as the ClientData argument to Tcl_CreateObjCommand. - * This callback is required because one can not simply pass - * a pointer to the free() or ckfree() to Tcl_CreateObjCommand. - * ------------------------------------------------------------------------ - */ -static void -ItclFreeParserCommandData( - ClientData cdata) /* client data to be destroyed */ -{ - ckfree(cdata); -} - -/* - * ------------------------------------------------------------------------ - * ItclDelObjectInfo() - * - * Invoked when the management info for [incr Tcl] is no longer being - * used in an interpreter. This will only occur when all class - * manipulation commands are removed from the interpreter. - * ------------------------------------------------------------------------ - */ -static void -ItclDelObjectInfo( - char* cdata) /* client data for class command */ -{ - Tcl_HashSearch place; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)cdata; - ItclObject *ioPtr; - - /* - * Destroy all known objects by deleting their access - * commands. - */ - hPtr = Tcl_FirstHashEntry(&infoPtr->objects, &place); - while (hPtr) { - ioPtr = (ItclObject*)Tcl_GetHashValue(hPtr); - Tcl_DeleteCommandFromToken(infoPtr->interp, ioPtr->accessCmd); - /* - * Fix 227804: Whenever an object to delete was found we - * have to reset the search to the beginning as the - * current entry in the search was deleted and accessing it - * is therefore not allowed anymore. - */ - - hPtr = Tcl_FirstHashEntry(&infoPtr->objects, &place); - /*hPtr = Tcl_NextHashEntry(&place);*/ - } - Tcl_DeleteHashTable(&infoPtr->objects); - - Itcl_DeleteStack(&infoPtr->clsStack); -/* FIXME !!! - free class_meta_type and object_meta_type -*/ - ckfree((char*)infoPtr); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassFilterCmd() - * - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassFilterCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj **newObjv; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - int result; - - ItclShowArgs(1, "Itcl_ClassFilterCmd", objc, objv); - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::filter called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/::itcl::type", - "/::itcl::extendedclass. Only these can have filters", NULL); - return TCL_ERROR; - } - if (objc < 2) { - Tcl_WrongNumArgs(interp, 1, objv, "<filterName> ?<filterName> ...?"); - return TCL_ERROR; - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*(objc+2)); - newObjv[0] = Tcl_NewStringObj("::oo::define", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj(Tcl_GetString(iclsPtr->fullNamePtr), -1); - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = Tcl_NewStringObj("filter", -1); - Tcl_IncrRefCount(newObjv[2]); - memcpy(newObjv+3, objv+1, sizeof(Tcl_Obj *)*(objc-1)); -ItclShowArgs(1, "Itcl_ClassFilterCmd2", objc+2, newObjv); - result = Tcl_EvalObjv(interp, objc+2, newObjv, 0); - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - ckfree((char *)newObjv); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassMixinCmd() - * - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassMixinCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclShowArgs(0, "Itcl_ClassMixinCmd", objc, objv); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_WidgetCmd() - * - * that is just a dummy command to load package ItclWidget - * and then to resend the command and execute it in that package - * package ItclWidget is renaming the Tcl command!! - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_WidgetCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr; - int result; - - ItclShowArgs(1, "Itcl_WidgetCmd", objc-1, objv); - infoPtr = (ItclObjectInfo *)clientData; - if (!infoPtr->itclWidgetInitted) { - result = Tcl_EvalEx(interp, initWidgetScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclWidgetInitted = 1; - } - return Tcl_EvalObjv(interp, objc, objv, 0); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_WidgetAdaptorCmd() - * - * that is just a dummy command to load package ItclWidget - * and then to resend the command and execute it in that package - * package ItclWidget is renaming the Tcl command!! - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_WidgetAdaptorCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr; - int result; - - ItclShowArgs(1, "Itcl_WidgetAdaptorCmd", objc-1, objv); - infoPtr = (ItclObjectInfo *)clientData; - if (!infoPtr->itclWidgetInitted) { - result = Tcl_EvalEx(interp, initWidgetScript, -1, 0); - if (result != TCL_OK) { - return result; - } - infoPtr->itclWidgetInitted = 1; - } - return Tcl_EvalObjv(interp, objc, objv, 0); -} - -/* - * ------------------------------------------------------------------------ - * ItclParseOption() - * - * Invoked by Tcl during the parsing whenever - * the "option" command is invoked to define an option - * Handles the following syntax: - * - * option - * - * ------------------------------------------------------------------------ - */ -int -ItclParseOption( - ItclObjectInfo *infoPtr, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[], /* argument objects */ - ItclClass *iclsPtr, - ItclObject *ioPtr, - ItclOption **ioptPtrPtr) /* where the otpion info is found */ -{ - Tcl_Obj *classNamePtr; - Tcl_Obj *nameSpecPtr; - Tcl_Obj **newObjv; - Tcl_HashEntry *hPtr; - ItclOption *ioptPtr; - char *init; - char *defaultValue; - char *cgetMethod; - char *cgetMethodVar; - char *configureMethod; - char *configureMethodVar; - char *validateMethod; - char *validateMethodVar; - const char *token; - const char *usage; - const char *optionName; - const char **argv; - const char *name; - const char *resourceName; - const char *className; - int argc; - int pLevel; - int readOnly; - int newObjc; - int foundOption; - int result; - int i; - const char *cp; - - ItclShowArgs(1, "ItclParseOption", objc, objv); - pLevel = Itcl_Protection(interp, 0); - - usage = "namespec \ -?init? \ -?-default value? \ -?-readonly? \ -?-cgetmethod methodName? \ -?-cgetmethodvar varName? \ -?-configuremethod methodName? \ -?-configuremethodvar varName? \ -?-validatemethod methodName? \ -?-validatemethodvar varName"; - - if (pLevel == ITCL_PUBLIC) { - if (objc < 2 || objc > 11) { - Tcl_WrongNumArgs(interp, 1, objv, usage); - return TCL_ERROR; - } - } else { - if ((objc < 2) || (objc > 12)) { - Tcl_WrongNumArgs(interp, 1, objv, usage); - return TCL_ERROR; - } - } - - argv = NULL; - newObjv = NULL; - defaultValue = NULL; - cgetMethod = NULL; - configureMethod = NULL; - validateMethod = NULL; - cgetMethodVar = NULL; - configureMethodVar = NULL; - validateMethodVar = NULL; - readOnly = 0; - newObjc = 0; - optionName = Tcl_GetString(objv[1]); - if (iclsPtr != NULL) { - /* check for already delegated!! */ - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedOptions, (char *)objv[1]); - if (hPtr != NULL) { - Tcl_AppendResult(interp, "cannot define option \"", optionName, - "\" locally, it has already been delegated", NULL); - result = TCL_ERROR; - goto errorOut; - } - } - if (ioPtr != NULL) { - /* check for already delegated!! */ - hPtr = Tcl_FindHashEntry(&ioPtr->objectDelegatedOptions, - (char *)objv[1]); - if (hPtr != NULL) { - Tcl_AppendResult(interp, "cannot define option \"", optionName, - "\" locally, it has already been delegated", NULL); - result = TCL_ERROR; - goto errorOut; - } - } - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *)*objc); - newObjv[newObjc] = objv[1]; - newObjc++; - for (i=2; i<objc; i++) { - token = Tcl_GetString(objv[i]); - foundOption = 0; - if (*token == '-') { - if (objc < i+1) { - Tcl_WrongNumArgs(interp, 1, objv, usage); - result = TCL_ERROR; - goto errorOut; - } - if (strcmp(token, "-default") == 0) { - foundOption = 1; - i++; - defaultValue = Tcl_GetString(objv[i]); - } else { - if (strcmp(token, "-readonly") == 0) { - foundOption = 1; - readOnly = 1; - } else { - if (strncmp(token, "-cgetmethod", 11) == 0) { - if (strcmp(token, "-cgetmethod") == 0) { - foundOption = 1; - i++; - cgetMethod = Tcl_GetString(objv[i]); - } - if (strcmp(token, "-cgetmethodvar") == 0) { - foundOption = 1; - i++; - cgetMethodVar = Tcl_GetString(objv[i]); - } - } else { - if (strncmp(token, "-configuremethod", 16) == 0) { - if (strcmp(token, "-configuremethod") == 0) { - foundOption = 1; - i++; - configureMethod = Tcl_GetString(objv[i]); - } - if (strcmp(token, "-configuremethodvar") == 0) { - foundOption = 1; - i++; - configureMethodVar = Tcl_GetString(objv[i]); - } - } else { - if (strncmp(token, "-validatemethod", 15) == 0) { - if (strcmp(token, "-validatemethod") == 0) { - foundOption = 1; - i++; - validateMethod = Tcl_GetString(objv[i]); - } - if (strcmp(token, "-validatemethodvar") == 0) { - foundOption = 1; - i++; - validateMethodVar = Tcl_GetString(objv[i]); - } - } - } - } - } - } - if (!foundOption) { - Tcl_AppendResult(interp, "funny option command option: \"", - token, "\"", NULL); - return TCL_ERROR; - } - } - if (!foundOption) { - newObjv[newObjc] = objv[i]; - newObjc++; - } - } - - if ((cgetMethod != NULL) && (cgetMethodVar != NULL)) { - Tcl_AppendResult(interp, - "option -cgetmethod and -cgetmethodvar cannot be used both", - NULL); - result = TCL_ERROR; - goto errorOut; - } - if ((configureMethod != NULL) && (configureMethodVar != NULL)) { - Tcl_AppendResult(interp, - "option -configuremethod and -configuremethodvar", - "cannot be used both", - NULL); - result = TCL_ERROR; - goto errorOut; - } - if ((validateMethod != NULL) && (validateMethodVar != NULL)) { - Tcl_AppendResult(interp, - "option -validatemethod and -validatemethodvar", - "cannot be used both", - NULL); - result = TCL_ERROR; - goto errorOut; - } - if (newObjc < 1) { - Tcl_AppendResult(interp, "usage: option ", usage, NULL); - result = TCL_ERROR; - goto errorOut; - } - resourceName = NULL; - className = NULL; - - nameSpecPtr = newObjv[0]; - token = Tcl_GetString(nameSpecPtr); - if (Tcl_SplitList(interp, (const char *)token, &argc, &argv) != TCL_OK) { - result = TCL_ERROR; - goto errorOut; - } - name = argv[0]; - if (*name != '-') { - Tcl_AppendResult(interp, "bad option name \"", name, - "\", options must start with a \"-\"", NULL); - result = TCL_ERROR; - goto errorOut; - } - - /* - * Make sure that the variable name does not contain anything - * goofy like a "::" scope qualifier. - */ - if (strstr(name, "::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad option name \"", name, - "\", option names must not contain \"::\"", (char*)NULL); - result = TCL_ERROR; - goto errorOut; - } - if (strstr(name, " ")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad option name \"", name, - "\", option names must not contain \" \"", (char*)NULL); - result = TCL_ERROR; - goto errorOut; - } - cp = name; - while (*cp) { - if (isupper(UCHAR(*cp))) { - Tcl_AppendResult(interp, "bad option name \"", name, "\" ", - ", options must not contain uppercase characters", NULL); - result = TCL_ERROR; - goto errorOut; - } - cp++; - } - if (argc > 1) { - resourceName = argv[1]; - } else { - /* resource name defaults to option name minus hyphen */ - resourceName = name+1; - } - if (argc > 2) { - className = argv[2]; - } else { - /* class name defaults to option name minus hyphen and capitalized */ - className = resourceName; - } - classNamePtr = ItclCapitalize(className); - init = defaultValue; - if ((newObjc > 1) && (init == NULL)) { - init = Tcl_GetString(newObjv[1]); - } - - ioptPtr = (ItclOption*)ckalloc(sizeof(ItclOption)); - memset(ioptPtr, 0, sizeof(ItclOption)); - ioptPtr->protection = Itcl_Protection(interp, 0); - if (ioptPtr->protection == ITCL_DEFAULT_PROTECT) { - ioptPtr->protection = ITCL_PROTECTED; - } - ioptPtr->namePtr = Tcl_NewStringObj(name, -1); - Tcl_IncrRefCount(ioptPtr->namePtr); - ioptPtr->resourceNamePtr = Tcl_NewStringObj(resourceName, -1); - Tcl_IncrRefCount(ioptPtr->resourceNamePtr); - ioptPtr->classNamePtr = Tcl_NewStringObj(Tcl_GetString(classNamePtr), -1); - Tcl_IncrRefCount(ioptPtr->classNamePtr); - Tcl_DecrRefCount(classNamePtr); - - if (init) { - ioptPtr->defaultValuePtr = Tcl_NewStringObj(init, -1); - Tcl_IncrRefCount(ioptPtr->defaultValuePtr); - } - if (cgetMethod != NULL) { - ioptPtr->cgetMethodPtr = Tcl_NewStringObj(cgetMethod, -1); - Tcl_IncrRefCount(ioptPtr->cgetMethodPtr); - } - if (configureMethod != NULL) { - ioptPtr->configureMethodPtr = Tcl_NewStringObj(configureMethod, -1); - Tcl_IncrRefCount(ioptPtr->configureMethodPtr); - } - if (validateMethod != NULL) { - ioptPtr->validateMethodPtr = Tcl_NewStringObj(validateMethod, -1); - Tcl_IncrRefCount(ioptPtr->validateMethodPtr); - } - if (cgetMethodVar != NULL) { - ioptPtr->cgetMethodVarPtr = Tcl_NewStringObj(cgetMethodVar, -1); - Tcl_IncrRefCount(ioptPtr->cgetMethodVarPtr); - } - if (configureMethodVar != NULL) { - ioptPtr->configureMethodVarPtr = Tcl_NewStringObj(configureMethodVar, -1); - Tcl_IncrRefCount(ioptPtr->configureMethodVarPtr); - } - if (validateMethodVar != NULL) { - ioptPtr->validateMethodVarPtr = Tcl_NewStringObj(validateMethodVar, -1); - Tcl_IncrRefCount(ioptPtr->validateMethodVarPtr); - } - if (readOnly != 0) { - ioptPtr->flags |= ITCL_OPTION_READONLY; - } - - *ioptPtrPtr = ioptPtr; - ItclAddOptionDictInfo(interp, iclsPtr, ioptPtr); - result = TCL_OK; -errorOut: - if (argv != NULL) { - ckfree((char *)argv); - } - if (newObjv != NULL) { - ckfree((char *)newObjv); - } - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassOptionCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "option" command is invoked to define an option - * Handles the following syntax: - * - * option - * - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassOptionCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclOption *ioptPtr; - const char *tkPackage; - const char *tkVersion; - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - - ItclShowArgs(1, "Itcl_ClassOptionCmd", objc, objv); - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::option called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "a \"class\" cannot have options", NULL); - return TCL_ERROR; - } - - if ((objc > 1) && (strcmp(Tcl_GetString(objv[1]), "add") == 0)) { - tkVersion = "8.6"; - tkPackage = Tcl_PkgPresent(interp, "Tk", tkVersion, 0); - if (tkPackage == NULL) { - tkPackage = Tcl_PkgRequire(interp, "Tk", tkVersion, 0); - } - if (tkPackage == NULL) { - Tcl_AppendResult(interp, "cannot load package Tk", tkVersion, - NULL); - return TCL_ERROR; - } - return Tcl_EvalObjv(interp, objc, objv, TCL_EVAL_GLOBAL); - } - if (ItclParseOption(infoPtr, interp, objc, objv, iclsPtr, NULL, - &ioptPtr) != TCL_OK) { - return TCL_ERROR; - } - - if (Itcl_CreateOption(interp, iclsPtr, ioptPtr) != TCL_OK) { - return TCL_ERROR; - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclCreateComponent() - * - * - * ------------------------------------------------------------------------ - */ -int -ItclCreateComponent( - Tcl_Interp *interp, - ItclClass *iclsPtr, - Tcl_Obj *componentPtr, - int type, - ItclComponent **icPtrPtr) -{ - Tcl_HashEntry *hPtr; - ItclComponent *icPtr; - ItclVariable *ivPtr; - int result; - int isNew; - - if (iclsPtr == NULL) { - return TCL_OK; - } - hPtr = Tcl_CreateHashEntry(&iclsPtr->components, (char *)componentPtr, - &isNew); - if (isNew) { - if (Itcl_CreateVariable(interp, iclsPtr, componentPtr, NULL, NULL, - &ivPtr) != TCL_OK) { - return TCL_ERROR; - } - if (type & ITCL_COMMON) { - result = ItclInitClassCommon(interp, iclsPtr, ivPtr, ""); - if (result != TCL_OK) { - return result; - } - } - if (iclsPtr->flags & (ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - if (strcmp(Tcl_GetString(componentPtr), "itcl_hull") == 0) { - /* special built in itcl_hull variable */ - ivPtr->initted = 1; - ivPtr->flags |= ITCL_HULL_VAR; - } - } - ivPtr->flags |= ITCL_COMPONENT_VAR; - icPtr = (ItclComponent *)ckalloc(sizeof(ItclComponent)); - memset(icPtr, 0, sizeof(ItclComponent)); - Tcl_InitObjHashTable(&icPtr->keptOptions); - icPtr->namePtr = componentPtr; - Tcl_IncrRefCount(icPtr->namePtr); - icPtr->ivPtr = ivPtr; - Tcl_SetHashValue(hPtr, icPtr); - ItclAddClassVariableDictInfo(interp, iclsPtr, ivPtr); - } else { - icPtr =Tcl_GetHashValue(hPtr); - } - *icPtrPtr = icPtr; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclHandleClassComponent() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "component" command is invoked to define a component - * Handles the following syntax: - * - * component - * - * ------------------------------------------------------------------------ - */ -static int -ItclHandleClassComponent( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[], /* argument objects */ - ItclComponent **icPtrPtr) -{ - Tcl_Obj **newObjv; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclComponent *icPtr; - const char *usage; - const char *public; - int inherit; - int haveInherit; - int havePublic; - int newObjc; - int haveValue; - int storageClass; - int i; - - ItclShowArgs(1, "Itcl_ClassComponentCmd", objc, objv); - if (icPtrPtr != NULL) { - *icPtrPtr = NULL; - } - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::component called from", - " not within a class", NULL); - return TCL_ERROR; - } - usage = "component ?-public <typemethod>? ?-inherit ?<flag>??"; - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::extendedclass/::itcl::widget", - "/::itcl::widgetadaptor/::itcl::type.", - " Only these can have components", NULL); - return TCL_ERROR; - } - if ((objc < 2) && (objc > 6)) { - Tcl_AppendResult(interp, "wrong # args should be: ", usage, NULL); - return TCL_ERROR; - } - inherit = 0; - haveInherit = 0; - public = NULL; - havePublic = 0; - for (i = 2; i < objc; i++) { - if (strcmp(Tcl_GetString(objv[i]), "-inherit") == 0) { - if (haveInherit) { - Tcl_AppendResult(interp, "wrong syntax should be: ", - usage, NULL); - return TCL_ERROR; - } - haveValue = 0; - inherit = 1; - if (i < objc - 1) { - if (strcmp(Tcl_GetString(objv[i + 1]), "yes") == 0) { - haveValue = 1; - } - if (strcmp(Tcl_GetString(objv[i + 1]), "YES") == 0) { - haveValue = 1; - } - if (strcmp(Tcl_GetString(objv[i + 1]), "no") == 0) { - haveValue = 1; - inherit = 0; - } - if (strcmp(Tcl_GetString(objv[i + 1]), "NO") == 0) { - haveValue = 1; - inherit = 0; - } - } - if (haveValue) { - i++; - } - haveInherit = 1; - } else { - if (strcmp(Tcl_GetString(objv[i]), "-public") == 0) { - if (havePublic) { - Tcl_AppendResult(interp, "wrong syntax should be: ", - usage, NULL); - return TCL_ERROR; - } - havePublic = 1; - if (i >= objc - 1) { - Tcl_AppendResult(interp, "wrong syntax should be: ", - usage, NULL); - return TCL_ERROR; - } - public = Tcl_GetString(objv[i + 1]); - } else { - Tcl_AppendResult(interp, "wrong syntax should be: ", - usage, NULL); - return TCL_ERROR; - } - } - i++; - } - storageClass = ITCL_COMMON; - if (iclsPtr->flags & ITCL_ECLASS) { - storageClass = 0; - } - if (ItclCreateComponent(interp, iclsPtr, objv[1], storageClass, - &icPtr) != TCL_OK) { - return TCL_ERROR; - } - if (inherit) { - icPtr->flags |= ITCL_COMPONENT_INHERIT; - newObjc = 4; - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*)*newObjc); - newObjv[0] = Tcl_NewStringObj("delegate::option", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj("*", -1); - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = Tcl_NewStringObj("to", -1); - Tcl_IncrRefCount(newObjv[2]); - newObjv[3] = objv[1]; - Tcl_IncrRefCount(newObjv[3]); - if (Itcl_ClassDelegateOptionCmd(infoPtr, interp, newObjc, newObjv) - != TCL_OK) { - return TCL_ERROR; - } - Tcl_SetStringObj(newObjv[0] , "delegate::method", -1); - if (Itcl_ClassDelegateMethodCmd(infoPtr, interp, newObjc, newObjv) - != TCL_OK) { - return TCL_ERROR; - } - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[3]); - ckfree((char *)newObjv); - } - if (public != NULL) { - icPtr->flags |= ITCL_COMPONENT_PUBLIC; - newObjc = 4; - newObjv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*)*newObjc); - newObjv[0] = Tcl_NewStringObj("delegate::method", -1); - Tcl_IncrRefCount(newObjv[0]); - newObjv[1] = Tcl_NewStringObj(public, -1); - Tcl_IncrRefCount(newObjv[1]); - newObjv[2] = Tcl_NewStringObj("to", -1); - Tcl_IncrRefCount(newObjv[2]); - newObjv[3] = objv[1]; - Tcl_IncrRefCount(newObjv[3]); - ItclShowArgs(1, "COMPPUB", newObjc, newObjv); - if (Itcl_ClassDelegateMethodCmd(infoPtr, interp, newObjc, newObjv) - != TCL_OK) { - return TCL_ERROR; - } - Tcl_DecrRefCount(newObjv[0]); - Tcl_DecrRefCount(newObjv[1]); - Tcl_DecrRefCount(newObjv[2]); - Tcl_DecrRefCount(newObjv[3]); - ckfree((char *)newObjv); - } - if (icPtrPtr != NULL) { - *icPtrPtr = icPtr; - } - ItclAddClassComponentDictInfo(interp, iclsPtr, icPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassComponentCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "component" command is invoked to define a component - * Handles the following syntax: - * - * component - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassComponentCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclComponent *icPtr; - - return ItclHandleClassComponent(clientData, interp, objc, objv, &icPtr); -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassTypeComponentCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "typecomponent" command is invoked to define a typecomponent - * Handles the following syntax: - * - * component - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassTypeComponentCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclComponent *icPtr; - int result; - - ItclShowArgs(1, "Itcl_ClassTypeComponentCmd", objc, objv); - result = ItclHandleClassComponent(clientData, interp, objc, objv, &icPtr); - if (result != TCL_OK) { - return result; - } - icPtr->ivPtr->flags |= ITCL_COMMON; - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclCreateDelegatedFunction() - * - * Install a delegated function for a class - * - * ------------------------------------------------------------------------ - */ -int -ItclCreateDelegatedFunction( - Tcl_Interp *interp, - ItclClass *iclsPtr, - Tcl_Obj *methodNamePtr, - ItclComponent *icPtr, - Tcl_Obj *targetPtr, - Tcl_Obj *usingPtr, - Tcl_Obj *exceptionsPtr, - ItclDelegatedFunction **idmPtrPtr) -{ - ItclDelegatedFunction *idmPtr; - const char **argv; - int argc; - int isNew; - int i; - - idmPtr = (ItclDelegatedFunction *)ckalloc(sizeof(ItclDelegatedFunction)); - memset(idmPtr, 0, sizeof(ItclDelegatedFunction)); - Tcl_InitObjHashTable(&idmPtr->exceptions); - idmPtr->namePtr = Tcl_NewStringObj(Tcl_GetString(methodNamePtr), -1); - Tcl_IncrRefCount(idmPtr->namePtr); - idmPtr->icPtr = icPtr; - idmPtr->asPtr = targetPtr; - if (idmPtr->asPtr != NULL) { - Tcl_IncrRefCount(idmPtr->asPtr); - } - idmPtr->usingPtr = usingPtr; - if (idmPtr->usingPtr != NULL) { - Tcl_IncrRefCount(idmPtr->usingPtr); - } - if (exceptionsPtr != NULL) { - if (Tcl_SplitList(interp, Tcl_GetString(exceptionsPtr), &argc, &argv) - != TCL_OK) { - return TCL_ERROR; - } - for(i = 0; i < argc; i++) { - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj(argv[i], -1); - Tcl_CreateHashEntry(&idmPtr->exceptions, (char *)objPtr, - &isNew); - } - ckfree((char *) argv); - } - if (idmPtrPtr != NULL) { - *idmPtrPtr = idmPtr; - } - ItclAddClassDelegatedFunctionDictInfo(interp, iclsPtr, idmPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_HandleDelegateMethodCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "delegate method" command is invoked to define a - * Handles the following syntax: - * - * delegate method - * - * ------------------------------------------------------------------------ - */ -int -Itcl_HandleDelegateMethodCmd( - Tcl_Interp *interp, /* current interpreter */ - ItclObject *ioPtr, /* != NULL for ::itcl::adddelegatedmethod - otherwise NULL */ - ItclClass *iclsPtr, /* != NULL for delegate method otherwise NULL */ - ItclDelegatedFunction **idmPtrPtr, - /* where to return idoPtr */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *methodNamePtr; - Tcl_Obj *componentPtr; - Tcl_Obj *targetPtr; - Tcl_Obj *usingPtr; - Tcl_Obj *exceptionsPtr; - Tcl_HashEntry *hPtr; - ItclClass *iclsPtr2; - ItclComponent *icPtr; - ItclHierIter hier; - const char *usageStr; - const char *methodName; - const char *component; - const char *token; - int result; - int i; - int foundOpt; - - ItclShowArgs(1, "Itcl_HandleDelegateMethodCmd", objc, objv); - usageStr = "delegate method <methodName> to <componentName> ?as <targetName>?\n\ -delegate method <methodName> ?to <componentName>? using <pattern>\n\ -delegate method * ?to <componentName>? ?using <pattern>? ?except <methods>?"; - if (objc < 4) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - componentPtr = NULL; - icPtr = NULL; - methodName = Tcl_GetString(objv[1]); - component = NULL; - targetPtr = NULL; - usingPtr = NULL; - exceptionsPtr = NULL; - for(i=2;i<objc;i++) { - token = Tcl_GetString(objv[i]); - if (i+1 == objc) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - foundOpt = 0; - if (strcmp(token, "to") == 0) { - i++; - component = Tcl_GetString(objv[i]); - componentPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "as") == 0) { - i++; - targetPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "except") == 0) { - i++; - exceptionsPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "using") == 0) { - i++; - usingPtr = objv[i]; - foundOpt++; - } - if (!foundOpt) { - Tcl_AppendResult(interp, "bad option \"", token, "\" should be ", - usageStr, NULL); - return TCL_ERROR; - } - } - if ((exceptionsPtr != NULL) && (*methodName != '*')) { - Tcl_AppendResult(interp, - "can only specify \"except\" with \"delegate method *\"", NULL); - return TCL_ERROR; - } - if ((component == NULL) && (usingPtr == NULL)) { - Tcl_AppendResult(interp, "missing to should be: ", usageStr, NULL); - return TCL_ERROR; - } - if ((*methodName == '*') && (targetPtr != NULL)) { - Tcl_AppendResult(interp, - "cannot specify \"as\" with \"delegate method *\"", NULL); - return TCL_ERROR; - } - /* check for already delegated */ - methodNamePtr = Tcl_NewStringObj(methodName, -1); - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectDelegatedFunctions, (char *) - methodNamePtr); - } else { - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, (char *) - methodNamePtr); - } - - hPtr = NULL; - if (ioPtr != NULL) { - if (componentPtr != NULL) { - Itcl_InitHierIter(&hier, ioPtr->iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->components, - (char *)componentPtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - } - } else { - if (componentPtr != NULL) { - iclsPtr2 = iclsPtr; - Itcl_InitHierIter(&hier, iclsPtr2); - while ((iclsPtr2 = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr2->components, - (char *)componentPtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - } - } - if (hPtr == NULL) { - if (componentPtr != NULL) { - if (ItclCreateComponent(interp, iclsPtr, componentPtr, - ITCL_COMMON, &icPtr) != TCL_OK) { - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&iclsPtr->components, - (char *)componentPtr); - } - } - if (hPtr != NULL) { - icPtr = Tcl_GetHashValue(hPtr); - } - if (*methodName != '*') { - /* FIXME !!! */ - /* check for locally defined method */ - hPtr = NULL; - if (ioPtr != NULL) { - } else { - /* FIXME !! have to check the hierarchy !! */ - hPtr = Tcl_FindHashEntry(&iclsPtr->functions, - (char *)methodNamePtr); - - } - if (hPtr != NULL) { - Tcl_AppendResult(interp, "method \"", methodName, - "\" has been defined locally", NULL); - result = TCL_ERROR; - goto errorOut; - } - } - result = ItclCreateDelegatedFunction(interp, iclsPtr, methodNamePtr, icPtr, - targetPtr, usingPtr, exceptionsPtr, idmPtrPtr); - (*idmPtrPtr)->flags |= ITCL_METHOD; -errorOut: - Tcl_DecrRefCount(methodNamePtr); - return result; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassDelegateMethodCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "delegate method" command is invoked to define a - * Handles the following syntax: - * - * delegate method - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassDelegateMethodCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclDelegatedFunction *idmPtr; - int isNew; - int result; - - ItclShowArgs(1, "Itcl_ClassDelegateMethodCmd", objc, objv); - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::delegatemethod called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/::itcl::type", - "/::itcl::extendedclass.", - " Only these can delegate methods", NULL); - return TCL_ERROR; - } - result = Itcl_HandleDelegateMethodCmd(interp, NULL, iclsPtr, &idmPtr, objc, - objv); - if (result != TCL_OK) { - return result; - } - idmPtr->flags |= ITCL_METHOD; - hPtr = Tcl_CreateHashEntry(&iclsPtr->delegatedFunctions, - (char *)idmPtr->namePtr, &isNew); - Tcl_SetHashValue(hPtr, idmPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_HandleDelegateOptionCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "delegate option" command is invoked to define a delegated option - * or if ::itcl::adddelegatedoption is called with an itcl object - * Handles the following syntax: - * - * delegate option ... - * - * ------------------------------------------------------------------------ - */ -int -Itcl_HandleDelegateOptionCmd( - Tcl_Interp *interp, /* current interpreter */ - ItclObject *ioPtr, /* != NULL for ::itcl::adddelgatedoption - otherwise NULL */ - ItclClass *iclsPtr, /* != NULL for delegate option otherwise NULL */ - ItclDelegatedOption **idoPtrPtr, - /* where to return idoPtr */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ - -{ - Tcl_Obj *allOptionNamePtr; - Tcl_Obj *optionNamePtr; - Tcl_Obj *componentPtr; - Tcl_Obj *targetPtr; - Tcl_Obj *exceptionsPtr; - Tcl_Obj *resourceNamePtr; - Tcl_Obj *classNamePtr; - Tcl_HashEntry *hPtr; - ItclComponent *icPtr; - ItclClass *iclsPtr2; - ItclDelegatedOption *idoPtr; - ItclHierIter hier; - const char *usageStr; - const char *option; - const char *component; - const char *token; - const char **argv; - int foundOpt; - int argc; - int isStarOption; - int isNew; - int i; - const char *cp; - - ItclShowArgs(1, "Itcl_HandleDelegatedOptionCmd", objc, objv); - usageStr = "<optionDef> to <targetDef> ?as <script>? ?except <script>?"; - if (objc < 4) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - componentPtr = NULL; - icPtr = NULL; - isStarOption = 0; - token = Tcl_GetString(objv[1]); - if (Tcl_SplitList(interp, (const char *)token, &argc, &argv) != TCL_OK) { - return TCL_ERROR; - } - option = argv[0]; - if (strcmp(option, "*") == 0) { - isStarOption = 1; - } - if ((argc < 1) || (isStarOption && (argc > 1))) { - Tcl_AppendResult(interp, "<optionDef> must be either \"*\" or ", - "\"<optionName> <resourceName> <className>\"", NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - if (isStarOption && (argc > 3)) { - Tcl_AppendResult(interp, "<optionDef> syntax should be: ", - "\"<optionName> <resourceName> <className>\"", NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - if ((*option != '-') && !isStarOption) { - Tcl_AppendResult(interp, "bad delegated option name \"", option, - "\", options must start with a \"-\"", NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - /* - * Make sure that the variable name does not contain anything - * goofy like a "::" scope qualifier. - */ - if (strstr(option, "::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad option name \"", option, - "\", option names must not contain \"::\"", (char*)NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - if (strstr(option, " ")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad option name \"", option, - "\", option names must not contain \" \"", (char*)NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - cp = option; - while (*cp) { - if (isupper(UCHAR(*cp))) { - Tcl_AppendResult(interp, "bad option name \"", option, "\" ", - ", options must not contain uppercase characters", NULL); - ckfree((char *)argv); - return TCL_ERROR; - } - cp++; - } - optionNamePtr = Tcl_NewStringObj(option, -1); - Tcl_IncrRefCount(optionNamePtr); - resourceNamePtr = NULL; - classNamePtr = NULL; - if (argc > 1) { - resourceNamePtr = Tcl_NewStringObj(argv[1], -1); - Tcl_IncrRefCount(resourceNamePtr); - } - if (argc > 2) { - classNamePtr = Tcl_NewStringObj(argv[2], -1); - } - component = NULL; - targetPtr = NULL; - exceptionsPtr = NULL; - for(i=2;i<objc;i++) { - token = Tcl_GetString(objv[i]); - if (i+1 == objc) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - goto errorOut1; - } - foundOpt = 0; - if (strcmp(token, "to") == 0) { - i++; - component = Tcl_GetString(objv[i]); - componentPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "as") == 0) { - i++; - targetPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "except") == 0) { - i++; - exceptionsPtr = objv[i]; - foundOpt++; - } - if (!foundOpt) { - Tcl_AppendResult(interp, "bad option \"", token, "\" should be ", - usageStr, NULL); - goto errorOut1; - } - } - if (component == NULL) { - Tcl_AppendResult(interp, "missing to should be: ", usageStr, NULL); - goto errorOut1; - } - if ((*option == '*') && (targetPtr != NULL)) { - Tcl_AppendResult(interp, - "cannot specify \"as\" with \"delegate option *\"", NULL); - goto errorOut1; - } - /* check for already delegated */ - allOptionNamePtr = Tcl_NewStringObj("*", -1); - Tcl_IncrRefCount(allOptionNamePtr); - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectDelegatedOptions, (char *) - allOptionNamePtr); - } else { - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedOptions, (char *) - allOptionNamePtr); - } - Tcl_DecrRefCount(allOptionNamePtr); - if (hPtr != NULL) { - Tcl_AppendResult(interp, "option \"", option, - "\" is already delegated", NULL); - goto errorOut1; - } - - if (ioPtr != NULL) { - Itcl_InitHierIter(&hier, ioPtr->iclsPtr); - while ((iclsPtr = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->components, - (char *)componentPtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - } else { - Itcl_InitHierIter(&hier, iclsPtr); - while ((iclsPtr2 = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr2->components, - (char *)componentPtr); - if (hPtr != NULL) { - break; - } - } - Itcl_DeleteHierIter(&hier); - } - if (hPtr == NULL) { - if (componentPtr != NULL) { - if (ItclCreateComponent(interp, iclsPtr, componentPtr, - ITCL_COMMON, &icPtr) != TCL_OK) { - goto errorOut1; - } - hPtr = Tcl_FindHashEntry(&iclsPtr->components, - (char *)componentPtr); - } - } - if (hPtr != NULL) { - icPtr = Tcl_GetHashValue(hPtr); - } - if (*option != '*') { - /* FIXME !!! */ - /* check for valid option name */ - if (ioPtr != NULL) { - hPtr = Tcl_FindHashEntry(&ioPtr->objectOptions, - (char *)optionNamePtr); - } else { - Itcl_InitHierIter(&hier, iclsPtr); - while ((iclsPtr2 = Itcl_AdvanceHierIter(&hier)) != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr2->options, - (char *)optionNamePtr); - if (hPtr != NULL) { - break; - } - } - } - if (hPtr != NULL) { - Tcl_AppendResult(interp, "option \"", option, - "\" has been defined locally", NULL); - goto errorOut1; - return TCL_ERROR; - } - } - idoPtr = (ItclDelegatedOption *)ckalloc(sizeof(ItclDelegatedOption)); - memset(idoPtr, 0, sizeof(ItclDelegatedOption)); - Tcl_InitObjHashTable(&idoPtr->exceptions); - if (*option != '*') { - if (targetPtr == NULL) { - targetPtr = optionNamePtr; - } - if (resourceNamePtr == NULL) { - resourceNamePtr = Tcl_NewStringObj(option+1, -1); - Tcl_IncrRefCount(resourceNamePtr); - } - if (classNamePtr == NULL) { - classNamePtr = ItclCapitalize(Tcl_GetString(resourceNamePtr)); - } - idoPtr->namePtr = optionNamePtr; - idoPtr->resourceNamePtr = resourceNamePtr; - idoPtr->classNamePtr = Tcl_NewStringObj( - Tcl_GetString(classNamePtr), -1); - Tcl_IncrRefCount(idoPtr->classNamePtr); - Tcl_DecrRefCount(classNamePtr); - - } else { - idoPtr->namePtr = optionNamePtr; - } - Itcl_PreserveData(idoPtr); - Itcl_EventuallyFree((ClientData)idoPtr, ItclDeleteDelegatedOption); - idoPtr->icPtr = icPtr; - idoPtr->asPtr = targetPtr; - if (idoPtr->asPtr != NULL) { - Tcl_IncrRefCount(idoPtr->asPtr); - } - if (exceptionsPtr != NULL) { - ckfree((char *)argv); - argv = NULL; - if (Tcl_SplitList(interp, Tcl_GetString(exceptionsPtr), &argc, &argv) - != TCL_OK) { - goto errorOut2; - } - for(i=0;i<argc;i++) { - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj(argv[i], -1); - hPtr = Tcl_CreateHashEntry(&idoPtr->exceptions, (char *)objPtr, - &isNew); - } - } - if (idoPtrPtr != NULL) { - *idoPtrPtr = idoPtr; - } - ckfree((char *)argv); - ItclAddDelegatedOptionDictInfo(interp, iclsPtr, idoPtr); - return TCL_OK; -errorOut2: - /* FIXME need to decr additional refCount's !! */ -errorOut1: - Tcl_DecrRefCount(optionNamePtr); - if (resourceNamePtr != NULL) { - Tcl_DecrRefCount(resourceNamePtr); - } - if (classNamePtr != NULL) { - Tcl_DecrRefCount(classNamePtr); - } - if (argv) { - ckfree((char *)argv); - } - return TCL_ERROR; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassDelegateOptionCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "delegate option" command is invoked to define a - * Handles the following syntax: - * - * delegate option - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassDelegateOptionCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclDelegatedOption *idoPtr; - const char *usageStr; - int isNew; - int result; - - ItclShowArgs(1, "Itcl_ClassDelegateOptionCmd", objc, objv); - usageStr = "<optionDef> to <targetDef> ?as <script>? ?except <script>?"; - if (objc < 4) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - infoPtr = (ItclObjectInfo *)clientData; - iclsPtr = (ItclClass *)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::delegateoption called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/::itcl::type", - "/::itcl::extendedclass.", - " Only these can delegate options", NULL); - return TCL_ERROR; - } - result = Itcl_HandleDelegateOptionCmd(interp, NULL, iclsPtr, &idoPtr, - objc, objv); - if (result != TCL_OK) { - return result; - } - hPtr = Tcl_CreateHashEntry(&iclsPtr->delegatedOptions, - (char *)idoPtr->namePtr, &isNew); - Tcl_SetHashValue(hPtr, idoPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassDelegateTypeMethodCmd() - * - * Invoked by Tcl during the parsing of a class definition whenever - * the "delegate typemethod" command is invoked to define a - * Handles the following syntax: - * - * delegate typemethod - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassDelegateTypeMethodCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *typeMethodNamePtr; - Tcl_Obj *componentPtr; - Tcl_Obj *targetPtr; - Tcl_Obj *usingPtr; - Tcl_Obj *exceptionsPtr; - Tcl_HashEntry *hPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclComponent *icPtr; - ItclDelegatedFunction *idmPtr; - const char *usageStr; - const char *typeMethodName; - const char *component; - const char *token; - const char **argv; - int foundOpt; - int argc; - int isNew; - int i; - - ItclShowArgs(1, "Itcl_ClassDelegateTypeMethodCmd", objc, objv); - usageStr = "delegate typemethod <typeMethodName> to <componentName> ?as <targetName>?\n\ -delegate typemethod <typeMethodName> ?to <componentName>? using <pattern>\n\ -delegate typemethod * ?to <componentName>? ?using <pattern>? ?except <typemethods>?"; - componentPtr = NULL; - icPtr = NULL; - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::delegatetypemethod called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/::itcl::type.", - " Only these can delegate typemethods", NULL); - return TCL_ERROR; - } - - if (objc < 4) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - typeMethodName = Tcl_GetString(objv[1]); - /* check if typeMethodName has been delegated */ - component = NULL; - targetPtr = NULL; - usingPtr = NULL; - exceptionsPtr = NULL; - for(i=2;i<objc;i++) { - token = Tcl_GetString(objv[i]); - if (i+1 == objc) { - Tcl_AppendResult(interp, "wrong # args should be ", usageStr, NULL); - return TCL_ERROR; - } - foundOpt = 0; - if (strcmp(token, "to") == 0) { - i++; - component = Tcl_GetString(objv[i]); - componentPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "as") == 0) { - i++; - targetPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "except") == 0) { - i++; - exceptionsPtr = objv[i]; - foundOpt++; - } - if (strcmp(token, "using") == 0) { - i++; - usingPtr = objv[i]; - foundOpt++; - } - if (!foundOpt) { - Tcl_AppendResult(interp, "bad option \"", token, "\" should be ", - usageStr, NULL); - return TCL_ERROR; - } - } - if ((component == NULL) && (usingPtr == NULL)) { - Tcl_AppendResult(interp, "missing to should be: ", usageStr, NULL); - return TCL_ERROR; - } - if ((*typeMethodName == '*') && (targetPtr != NULL)) { - Tcl_AppendResult(interp, - "cannot specify \"as\" with \"delegate typemethod *\"", NULL); - return TCL_ERROR; - } - if (componentPtr != NULL) { - hPtr = Tcl_FindHashEntry(&iclsPtr->components, (char *)componentPtr); - if (hPtr == NULL) { - if (ItclCreateComponent(interp, iclsPtr, componentPtr, - ITCL_COMMON, &icPtr) != TCL_OK) { - return TCL_ERROR; - } - } else { - icPtr = Tcl_GetHashValue(hPtr); - } - } else { - icPtr = NULL; - } - idmPtr = (ItclDelegatedFunction *)ckalloc(sizeof(ItclDelegatedFunction)); - memset(idmPtr, 0, sizeof(ItclDelegatedFunction)); - Tcl_InitObjHashTable(&idmPtr->exceptions); - typeMethodNamePtr = Tcl_NewStringObj(typeMethodName, -1); - if (*typeMethodName != '*') { - /* FIXME !!! */ - /* check for locally defined typemethod */ - hPtr = Tcl_FindHashEntry(&iclsPtr->functions, - (char *)typeMethodNamePtr); - if (hPtr != NULL) { - Tcl_AppendResult(interp, "Error in \"delegate typemethod ", - typeMethodName, "...\", \"", typeMethodName, - "\" has been defined locally.", NULL); - Tcl_DeleteHashTable(&idmPtr->exceptions); - ckfree((char *)idmPtr); - Tcl_DecrRefCount(typeMethodNamePtr); - return TCL_ERROR; - } - idmPtr->namePtr = Tcl_NewStringObj( - Tcl_GetString(typeMethodNamePtr), -1); - Tcl_IncrRefCount(idmPtr->namePtr); - } else { - Tcl_DecrRefCount(typeMethodNamePtr); - typeMethodNamePtr = Tcl_NewStringObj("*", -1); - Tcl_IncrRefCount(typeMethodNamePtr); - idmPtr->namePtr = typeMethodNamePtr; - Tcl_IncrRefCount(typeMethodNamePtr); - if (exceptionsPtr != NULL) { - if (Tcl_SplitList(interp, Tcl_GetString(exceptionsPtr), - &argc, &argv) != TCL_OK) { - return TCL_ERROR; - } - for(i = 0; i < argc; i++) { - Tcl_Obj *objPtr; - objPtr = Tcl_NewStringObj(argv[i], -1); - hPtr = Tcl_CreateHashEntry(&idmPtr->exceptions, (char *)objPtr, - &isNew); - } - ckfree((char *) argv); - } - } - idmPtr->icPtr = icPtr; - idmPtr->asPtr = targetPtr; - if (idmPtr->asPtr != NULL) { - Tcl_IncrRefCount(idmPtr->asPtr); - } - idmPtr->usingPtr = usingPtr; - if (idmPtr->usingPtr != NULL) { - Tcl_IncrRefCount(idmPtr->usingPtr); - } - idmPtr->flags = ITCL_COMMON|ITCL_TYPE_METHOD; - hPtr = Tcl_CreateHashEntry(&iclsPtr->delegatedFunctions, - (char *)idmPtr->namePtr, &isNew); - if (!isNew) { - ItclDeleteDelegatedFunction((ItclDelegatedFunction *) - Tcl_GetHashValue(hPtr)); - } - Tcl_SetHashValue(hPtr, idmPtr); - Tcl_DecrRefCount(typeMethodNamePtr); - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_ClassForwardCmd() - * - * Used similar to interp alias to forward the call of a method - * to another method within the class - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_ClassForwardCmd( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *prefixObj; - Tcl_Method mPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - - ItclShowArgs(1, "Itcl_ClassForwardCmd", objc, objv); - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::forward called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/", - "::itcl::type/::itcl::extendedclass.", - " Only these can forward", NULL); - return TCL_ERROR; - } - if (objc < 3) { - Tcl_WrongNumArgs(interp, 1, objv, "<forwardName> <targetName> ?<arg> ...?"); - return TCL_ERROR; - } - prefixObj = Tcl_NewListObj(objc-2, objv+2); - mPtr = Itcl_NewForwardClassMethod(interp, iclsPtr->clsPtr, 1, - objv[1], prefixObj); - if (mPtr == NULL) { - return TCL_ERROR; - } - return TCL_OK; -} -/* - * ------------------------------------------------------------------------ - * Itcl_ClassMethodVariableCmd() - * - * Used to similar to iterp alias to forward the call of a method - * to another method within the class - * - * Returns TCL_OK/TCL_ERROR to indicate success/failure. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static int -Itcl_ClassMethodVariableCmd( - ClientData clientData, /* unused */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Obj *namePtr; - Tcl_Obj *defaultPtr; - Tcl_Obj *callbackPtr; - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclVariable *ivPtr; - ItclMemberFunc *imPtr; - ItclMethodVariable *imvPtr; - const char *token; - const char *usageStr; - int i; - int foundOpt; - int result; - Tcl_Obj *objPtr; - - ItclShowArgs(1, "Itcl_ClassMethodVariableCmd", objc, objv); - infoPtr = (ItclObjectInfo*)clientData; - iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::methodvariable called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "\"", Tcl_GetString(iclsPtr->namePtr), - " is no ::itcl::widget/::itcl::widgetadaptor/", - "::itcl::type/::itcl::extendedclass.", - " Only these can have methodvariables", NULL); - return TCL_ERROR; - } - usageStr = "<name> ?-default value? ?-callback script?"; - if ((objc < 2) || (objc > 6)) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - - /* - * Make sure that the variable name does not contain anything - * goofy like a "::" scope qualifier. - */ - namePtr = objv[1]; - if (strstr(Tcl_GetString(namePtr), "::")) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "bad variable name \"", Tcl_GetString(namePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - defaultPtr = NULL; - callbackPtr = NULL; - for (i=2;i<objc;i++) { - foundOpt = 0; - token = Tcl_GetString(objv[i]); - if (strcmp(token, "-default") == 0) { - if (i+1 > objc) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - defaultPtr = objv[i+1]; - i++; - foundOpt++; - } - if (strcmp(token, "-callback") == 0) { - if (i+1 > objc) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - callbackPtr = objv[i+1]; - i++; - foundOpt++; - } - if (!foundOpt) { - Tcl_WrongNumArgs(interp, 1, objv, usageStr); - return TCL_ERROR; - } - } - - if (Itcl_CreateVariable(interp, iclsPtr, namePtr, - Tcl_GetString(defaultPtr), NULL, &ivPtr) != TCL_OK) { - return TCL_ERROR; - } - iclsPtr->numVariables++; - result = Itcl_CreateMethodVariable(interp, iclsPtr, namePtr, defaultPtr, - callbackPtr, &imvPtr); - if (result != TCL_OK) { - return result; - } - objPtr = Tcl_NewStringObj("@itcl-builtin-setget ", -1); - Tcl_AppendToObj(objPtr, Tcl_GetString(namePtr), -1); - Tcl_AppendToObj(objPtr, " ", 1); - result = ItclCreateMethod(interp, iclsPtr, namePtr, "args", - Tcl_GetString(objPtr), &imPtr); - if (result != TCL_OK) { - return result; - } - /* install a write trace if callbackPtr != NULL */ - /* FIXME to be done */ - ItclAddClassVariableDictInfo(interp, iclsPtr, ivPtr); - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassTypeConstructorCmd() - * - * Invoked by Tcl during the parsing of a type class definition whenever - * the "typeconstructor" command is invoked to define the typeconstructor - * for an object. Handles the following syntax: - * - * typeconstructor <body> - * - * ------------------------------------------------------------------------ - */ -static int -Itcl_ClassTypeConstructorCmd( - ClientData clientData, /* info for all known objects */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - Tcl_Obj *namePtr; - - ItclShowArgs(1, "Itcl_ClassTypeConstructorCmd", objc, objv); - - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "Error: ::itcl::parser::typeconstructor called from", - " not within a class", NULL); - return TCL_ERROR; - } - if (iclsPtr->flags & ITCL_CLASS) { - Tcl_AppendResult(interp, "a \"class\" cannot have a typeconstructor", - NULL); - return TCL_ERROR; - } - - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "body"); - return TCL_ERROR; - } - - namePtr = objv[0]; - if (iclsPtr->typeConstructorPtr != NULL) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "\"", Tcl_GetString(namePtr), "\" already defined in class \"", - Tcl_GetString(iclsPtr->fullNamePtr), "\"", - (char*)NULL); - return TCL_ERROR; - } - - iclsPtr->typeConstructorPtr = Tcl_NewStringObj(Tcl_GetString(objv[1]), -1); - Tcl_IncrRefCount(iclsPtr->typeConstructorPtr); - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve.c deleted file mode 100644 index c22ced2..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve.c +++ /dev/null @@ -1,697 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * These procedures handle command and variable resolution - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -/* - * This structure is a subclass of Tcl_ResolvedVarInfo that contains the - * ItclVarLookup info needed at runtime. - */ -typedef struct ItclResolvedVarInfo { - Tcl_ResolvedVarInfo vinfo; /* This must be the first element. */ - ItclVarLookup *vlookup; /* Pointer to lookup info. */ -} ItclResolvedVarInfo; - -static Tcl_Var ItclClassRuntimeVarResolver( - Tcl_Interp *interp, Tcl_ResolvedVarInfo *vinfoPtr); - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCmdResolver() - * - * Used by the class namespaces to handle name resolution for all - * commands. This procedure looks for references to class methods - * and procs, and returns TCL_OK along with the appropriate Tcl - * command in the rPtr argument. If a particular command is private, - * this procedure returns TCL_ERROR and access to the command is - * denied. If a command is not recognized, this procedure returns - * TCL_CONTINUE, and lookup continues via the normal Tcl name - * resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCmdResolver( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the command being accessed */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - int flags, /* TCL_LEAVE_ERR_MSG => leave error messages - * in interp if anything goes wrong */ - Tcl_Command *rPtr) /* returns: resolved command */ -{ - Tcl_HashEntry *hPtr; - Tcl_Obj *objPtr; - Tcl_Obj *namePtr; - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - ItclMemberFunc *imPtr; - int inOptionHandling; - int isCmdDeleted; - - if ((name[0] == 't') && (strcmp(name, "this") == 0)) { - return TCL_CONTINUE; - } - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - /* - * If the command is a member function - */ - imPtr = NULL; - objPtr = Tcl_NewStringObj(name, -1); - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - if (hPtr == NULL) { - ItclCmdLookup *clookup; - if ((iclsPtr->flags & ITCL_ECLASS)) { - namePtr = Tcl_NewStringObj(name, -1); - hPtr = Tcl_FindHashEntry(&iclsPtr->delegatedFunctions, - (char *)namePtr); - if (hPtr != NULL) { - objPtr = Tcl_NewStringObj("unknown", -1); - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveCmds, (char *)objPtr); - Tcl_DecrRefCount(objPtr); - } - Tcl_DecrRefCount(namePtr); - } - if (hPtr == NULL) { - return TCL_CONTINUE; - } - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - } else { - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(hPtr); - imPtr = clookup->imPtr; - } - - if (iclsPtr->flags & (ITCL_TYPE|ITCL_WIDGET|ITCL_WIDGETADAPTOR)) { - /* FIXME check if called from an (instance) method (not from a typemethod) and only then error */ - int isOk = 0; - if (strcmp(name, "info") == 0) { - isOk = 1; - } - if (strcmp(name, "mytypemethod") == 0) { - isOk = 1; - } - if (strcmp(name, "myproc") == 0) { - isOk = 1; - } - if (strcmp(name, "mymethod") == 0) { - isOk = 1; - } - if (strcmp(name, "mytypevar") == 0) { - isOk = 1; - } - if (strcmp(name, "myvar") == 0) { - isOk = 1; - } - if (strcmp(name, "itcl_hull") == 0) { - isOk = 1; - } - if (strcmp(name, "callinstance") == 0) { - isOk = 1; - } - if (strcmp(name, "getinstancevar") == 0) { - isOk = 1; - } - if (strcmp(name, "installcomponent") == 0) { - isOk = 1; - } - if (! isOk) { - if ((imPtr->flags & ITCL_TYPE_METHOD) != 0) { - Tcl_AppendResult(interp, "invalid command name \"", name, - "\"", NULL); - return TCL_ERROR; - } - inOptionHandling = imPtr->iclsPtr->infoPtr->inOptionHandling; - if (((imPtr->flags & ITCL_COMMON) == 0) && !inOptionHandling) { - /* a method cannot be called directly in ITCL_TYPE - * so look, if there is a corresponding proc in the - * namespace one level up (i.e. for example ::). If yes - * use that. - */ - Tcl_Namespace *nsPtr2; - Tcl_Command cmdPtr; - nsPtr2 = Itcl_GetUplevelNamespace(interp, 1); - cmdPtr = NULL; - if (nsPtr != nsPtr2) { - cmdPtr = Tcl_FindCommand(interp, name, nsPtr2, 0); - } - if (cmdPtr != NULL) { - *rPtr = cmdPtr; - return TCL_OK; - } - Tcl_AppendResult(interp, "invalid command name \"", name, - "\"", NULL); - return TCL_ERROR; - } - } - } - /* - * Looks like we found an accessible member function. - * - * TRICKY NOTE: Check to make sure that the command handle - * is still valid. If someone has deleted or renamed the - * command, it may not be. This is just the time to catch - * it--as it is being resolved again by the compiler. - */ - - /* - * The following #if is needed so itcl can be compiled with - * all versions of Tcl. The integer "deleted" was renamed to - * "flags" in tcl8.4a2. This #if is also found in itcl_ensemble.c . - * We're using a runtime check with itclCompatFlags to adjust for - * the behavior of this change, too. - * - */ -/* FIXME !!! */ -isCmdDeleted = 0; -/* isCmdDeleted = (!imPtr->accessCmd || imPtr->accessCmd->flags); */ - - if (isCmdDeleted) { - imPtr->accessCmd = NULL; - - if ((flags & TCL_LEAVE_ERR_MSG) != 0) { - Tcl_AppendResult(interp, - "can't access \"", name, "\": deleted or redefined\n", - "(use the \"body\" command to redefine methods/procs)", - (char*)NULL); - } - return TCL_ERROR; /* disallow access! */ - } - *rPtr = imPtr->accessCmd; - return TCL_OK; -} - -/* #define VAR_DEBUG */ - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassVarResolver() - * - * Used by the class namespaces to handle name resolution for runtime - * variable accesses. This procedure looks for references to both - * common variables and instance variables at runtime. It is used as - * a second line of defense, to handle references that could not be - * resolved as compiled locals. - * - * If a variable is found, this procedure returns TCL_OK along with - * the appropriate Tcl variable in the rPtr argument. If a particular - * variable is private, this procedure returns TCL_ERROR and access - * to the variable is denied. If a variable is not recognized, this - * procedure returns TCL_CONTINUE, and lookup continues via the normal - * Tcl name resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassVarResolver( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - int flags, /* TCL_LEAVE_ERR_MSG => leave error messages - * in interp if anything goes wrong */ - Tcl_Var *rPtr) /* returns: resolved variable */ -{ - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclObject *contextIoPtr; - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - - contextIoPtr = NULL; - /* - * If this is a global variable, handle it in the usual - * Tcl manner. - */ - if (flags & TCL_GLOBAL_ONLY) { - return TCL_CONTINUE; - } - - /* - * See if this is a formal parameter in the current proc scope. - * If so, that variable has precedence. - */ - if ((strstr(name,"::") == NULL) && - Itcl_IsCallFrameArgument(interp, name)) { - return TCL_CONTINUE; - } - - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - - /* - * See if the variable is a known data member and accessible. - */ - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, name); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - if (!vlookup->accessible) { - return TCL_CONTINUE; - } - - /* - * If this is a common data member, then its variable - * is easy to find. Return it directly. - */ - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - *rPtr = Tcl_GetHashValue(hPtr); - return TCL_OK; - } - } - - /* - * If this is an instance variable, then we have to - * find the object context, - */ - if (TCL_ERROR == Itcl_GetContext(interp, &iclsPtr, &contextIoPtr) - || (contextIoPtr == NULL)) { - return TCL_CONTINUE; - } - /* Check that the object hasn't already been destroyed. */ - hPtr = Tcl_FindHashEntry(&infoPtr->objects, (char *)contextIoPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - if (contextIoPtr->iclsPtr != vlookup->ivPtr->iclsPtr) { - if (strcmp(Tcl_GetString(vlookup->ivPtr->namePtr), "this") == 0) { - hPtr = Tcl_FindHashEntry(&contextIoPtr->iclsPtr->resolveVars, - Tcl_GetString(vlookup->ivPtr->namePtr)); - - if (hPtr != NULL) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - } - } - } - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectVariables, - (char *)vlookup->ivPtr); - - if (hPtr == NULL) { - return TCL_CONTINUE; - } - if (strcmp(name, "this") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - if (vlookup->ivPtr->iclsPtr->nsPtr == NULL) { - /* deletion of class is running */ - Tcl_DStringAppend(&buffer, - Tcl_GetCurrentNamespace(interp)->fullName, -1); - } else { - Tcl_DStringAppend(&buffer, - vlookup->ivPtr->iclsPtr->nsPtr->fullName, -1); - } - Tcl_DStringAppend(&buffer, "::this", 6); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), NULL, 0); - if (varPtr != NULL) { - *rPtr = varPtr; - return TCL_OK; - } - } - if (strcmp(name, "itcl_options") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - Tcl_DStringAppend(&buffer, "::itcl_options", -1); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - if (varPtr != NULL) { - *rPtr = varPtr; - return TCL_OK; - } - } - if (strcmp(name, "itcl_option_components") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - Tcl_DStringAppend(&buffer, "::itcl_option_components", -1); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), NULL, 0); - Tcl_DStringFree(&buffer); - if (varPtr != NULL) { - *rPtr = varPtr; - return TCL_OK; - } - } - if (hPtr != NULL) { - *rPtr = Tcl_GetHashValue(hPtr); - return TCL_OK; - } - return TCL_CONTINUE; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCompiledVarResolver() - * - * Used by the class namespaces to handle name resolution for compile - * time variable accesses. This procedure looks for references to - * both common variables and instance variables at compile time. If - * the variables are found, they are characterized in a generic way - * by their ItclVarLookup record. At runtime, Tcl constructs the - * compiled local variables by calling ItclClassRuntimeVarResolver. - * - * If a variable is found, this procedure returns TCL_OK along with - * information about the variable in the rPtr argument. If a particular - * variable is private, this procedure returns TCL_ERROR and access - * to the variable is denied. If a variable is not recognized, this - * procedure returns TCL_CONTINUE, and lookup continues via the normal - * Tcl name resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCompiledVarResolver( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - int length, /* number of characters in name */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - Tcl_ResolvedVarInfo **rPtr) /* returns: info that makes it possible to - * resolve the variable at runtime */ -{ - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - char *buffer; - char storage[64]; - - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - /* - * Copy the name to local storage so we can NULL terminate it. - * If the name is long, allocate extra space for it. - */ - if ((unsigned int)length < sizeof(storage)) { - buffer = storage; - } else { - buffer = (char*)ckalloc((unsigned)(length+1)); - } - memcpy((void*)buffer, (void*)name, (size_t)length); - buffer[length] = '\0'; - - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, buffer); - - if (buffer != storage) { - ckfree(buffer); - } - - /* - * If the name is not found, or if it is inaccessible, - * continue on with the normal Tcl name resolution rules. - */ - if (hPtr == NULL) { - return TCL_CONTINUE; - } - - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - if (!vlookup->accessible) { - return TCL_CONTINUE; - } - - /* - * Return the ItclVarLookup record. At runtime, Tcl will - * call ItclClassRuntimeVarResolver with this record, to - * plug in the appropriate variable for the current object - * context. - */ - (*rPtr) = (Tcl_ResolvedVarInfo *) ckalloc(sizeof(ItclResolvedVarInfo)); - (*rPtr)->fetchProc = ItclClassRuntimeVarResolver; - (*rPtr)->deleteProc = NULL; - ((ItclResolvedVarInfo*)(*rPtr))->vlookup = vlookup; - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * ItclClassRuntimeVarResolver() - * - * Invoked when Tcl sets up the call frame for an [incr Tcl] method/proc - * at runtime. Resolves data members identified earlier by - * Itcl_ClassCompiledVarResolver. Returns the Tcl_Var representation - * for the data member. - * ------------------------------------------------------------------------ - */ -static Tcl_Var -ItclClassRuntimeVarResolver( - Tcl_Interp *interp, /* current interpreter */ - Tcl_ResolvedVarInfo *resVarInfo) /* contains ItclVarLookup rep - * for variable */ -{ - ItclVarLookup *vlookup = ((ItclResolvedVarInfo*)resVarInfo)->vlookup; - ItclClass *iclsPtr; - ItclObject *contextIoPtr; - Tcl_HashEntry *hPtr; - - /* - * If this is a common data member, then the associated - * variable is known directly. - */ - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - return Tcl_GetHashValue(hPtr); - } - } - - /* - * Otherwise, get the current object context and find the - * variable in its data table. - * - * TRICKY NOTE: Get the index for this variable using the - * virtual table for the MOST-SPECIFIC class. - */ - if (TCL_ERROR == Itcl_GetContext(interp, &iclsPtr, &contextIoPtr) - || (contextIoPtr == NULL)) { - return NULL; - } - - if (contextIoPtr->iclsPtr != vlookup->ivPtr->iclsPtr) { - if (strcmp(Tcl_GetString(vlookup->ivPtr->namePtr), "this") == 0) { - /* only for the this variable we need the one of the - * contextIoPtr class */ - hPtr = Tcl_FindHashEntry(&contextIoPtr->iclsPtr->resolveVars, - Tcl_GetString(vlookup->ivPtr->namePtr)); - - if (hPtr != NULL) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - } - } - } - hPtr = Tcl_FindHashEntry(&contextIoPtr->objectVariables, - (char *)vlookup->ivPtr); - if (strcmp(Tcl_GetString(vlookup->ivPtr->namePtr), "this") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - if (vlookup->ivPtr->iclsPtr->nsPtr == NULL) { - Tcl_DStringAppend(&buffer, - Tcl_GetCurrentNamespace(interp)->fullName, -1); - } else { - Tcl_DStringAppend(&buffer, - vlookup->ivPtr->iclsPtr->nsPtr->fullName, -1); - } - Tcl_DStringAppend(&buffer, "::this", 6); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), - NULL, 0); - if (varPtr != NULL) { - return varPtr; - } - } - if (strcmp(Tcl_GetString(vlookup->ivPtr->namePtr), - "itcl_options") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - Tcl_DStringAppend(&buffer, "::itcl_options", -1); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), - NULL, 0); - Tcl_DStringFree(&buffer); - if (varPtr != NULL) { - return varPtr; - } - } - if (strcmp(Tcl_GetString(vlookup->ivPtr->namePtr), - "itcl_option_components") == 0) { - Tcl_Var varPtr; - Tcl_DString buffer; - - Tcl_DStringInit(&buffer); - Tcl_DStringAppend(&buffer, ITCL_VARIABLES_NAMESPACE, -1); - Tcl_DStringAppend(&buffer, - (Tcl_GetObjectNamespace(contextIoPtr->oPtr)->fullName), -1); - Tcl_DStringAppend(&buffer, "::itcl_option_components", -1); - varPtr = Itcl_FindNamespaceVar(interp, Tcl_DStringValue(&buffer), - NULL, 0); - Tcl_DStringFree(&buffer); - if (varPtr != NULL) { - return varPtr; - } - } - if (hPtr != NULL) { - return (Tcl_Var)Tcl_GetHashValue(hPtr); - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ParseVarResolver() - * - * Used by the "parser" namespace to resolve variable accesses to - * common variables. The runtime resolver procedure is consulted - * whenever a variable is accessed within the namespace. It can - * deny access to certain variables, or perform special lookups itself. - * - * This procedure allows access only to "common" class variables that - * have been declared within the class or inherited from another class. - * A "set" command can be used to initialized common data members within - * the body of the class definition itself: - * - * itcl::class Foo { - * common colors - * set colors(red) #ff0000 - * set colors(green) #00ff00 - * set colors(blue) #0000ff - * ... - * } - * - * itcl::class Bar { - * inherit Foo - * set colors(gray) #a0a0a0 - * set colors(white) #ffffff - * - * common numbers - * set numbers(0) zero - * set numbers(1) one - * } - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ParseVarResolver( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - Tcl_Namespace *contextNs, /* namespace context */ - int flags, /* TCL_GLOBAL_ONLY => global variable - * TCL_NAMESPACE_ONLY => namespace variable */ - Tcl_Var* rPtr) /* returns: Tcl_Var for desired variable */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)contextNs->clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - - /* - * See if the requested variable is a recognized "common" member. - * If it is, make sure that access is allowed. - */ - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, name); - if (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - if (!vlookup->accessible) { - Tcl_AppendResult(interp, - "can't access \"", name, "\": ", - Itcl_ProtectionStr(vlookup->ivPtr->protection), - " variable", - (char*)NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - *rPtr = Tcl_GetHashValue(hPtr); - return TCL_OK; - } - } - } - - /* - * If the variable is not recognized, return TCL_CONTINUE and - * let lookup continue via the normal name resolution rules. - * This is important for variables like "errorInfo" - * that might get set while the parser namespace is active. - */ - return TCL_CONTINUE; -} - - - -int -ItclSetParserResolver( - Tcl_Namespace *nsPtr) -{ - Itcl_SetNamespaceResolvers(nsPtr, (Tcl_ResolveCmdProc*)NULL, - Itcl_ParseVarResolver, (Tcl_ResolveCompiledVarProc*)NULL); - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve2.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve2.c deleted file mode 100644 index b75a5a3..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclResolve2.c +++ /dev/null @@ -1,564 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * These procedures handle command and variable resolution - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * - * ======================================================================== - * Copyright (c) Arnulf Wiedemann - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include <tclInt.h> -#include "itclInt.h" -#include "itclVCInt.h" - -/* - * This structure is a subclass of Tcl_ResolvedVarInfo that contains the - * ItclVarLookup info needed at runtime. - */ -typedef struct ItclResolvedVarInfo { - Tcl_ResolvedVarInfo vinfo; /* This must be the first element. */ - ItclVarLookup *vlookup; /* Pointer to lookup info. */ -} ItclResolvedVarInfo; - -static Tcl_Var ItclClassRuntimeVarResolver2 ( - Tcl_Interp *interp, Tcl_ResolvedVarInfo *vinfoPtr); - -int -Itcl_CheckClassVariableProtection( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *varName, - ClientData clientData) -{ - ItclClassVarInfo *icviPtr; - - icviPtr = (ItclClassVarInfo *)clientData; - if (icviPtr->protection == ITCL_PRIVATE) { - if (icviPtr->declaringNsPtr != nsPtr) { - Tcl_AppendResult(interp, "can't read \"", varName, - "\": no such variable", NULL); - return TCL_ERROR; - } - } - return TCL_OK; -} - -int -Itcl_CheckClassCommandProtection( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *commandName, - ClientData clientData) -{ - /* FIXME need code here !!! */ - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCmdResolver() - * - * Used by the class namespaces to handle name resolution for all - * commands. This procedure looks for references to class methods - * and procs, and returns TCL_OK along with the appropriate Tcl - * command in the rPtr argument. If a particular command is private, - * this procedure returns TCL_ERROR and access to the command is - * denied. If a command is not recognized, this procedure returns - * TCL_CONTINUE, and lookup continues via the normal Tcl name - * resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCmdResolver2( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the command being accessed */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - int flags, /* TCL_LEAVE_ERR_MSG => leave error messages - * in interp if anything goes wrong */ - Tcl_Command *rPtr) /* returns: resolved command */ -{ - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - ItclObject *contextIoPtr; - - Tcl_Command cmdPtr; - ItclResolvingInfo *iriPtr; - ObjectCmdTableInfo *octiPtr; - ObjectCmdInfo *ociPtr; - Tcl_HashEntry *hPtr; - - if ((name[0] == 't') && (strcmp(name, "this") == 0)) { - return TCL_CONTINUE; - } - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - ItclCallContext *callContextPtr; - callContextPtr = Itcl_PeekStack(&infoPtr->contextStack); - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_FindHashEntry(&iriPtr->resolveCmds , nsPtr->fullName); - if (hPtr != NULL) { - Tcl_HashTable *tablePtr; - tablePtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(tablePtr, name); - if (hPtr != NULL) { - ItclClassCmdInfo *icciPtr = Tcl_GetHashValue(hPtr); - if ((callContextPtr != NULL) && (callContextPtr->ioPtr != NULL)) { - contextIoPtr = callContextPtr->ioPtr; - hPtr = Tcl_FindHashEntry(&iriPtr->objectCmdsTables, - (char *)contextIoPtr); - if (hPtr != NULL) { - octiPtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(&octiPtr->cmdInfos, - (char *)icciPtr); - if (hPtr != NULL) { - int ret; - ociPtr = Tcl_GetHashValue(hPtr); - ret = (* iriPtr->cmdProtFcn)(interp, - Tcl_GetCurrentNamespace(interp), name, - (ClientData)icciPtr); - if (ret != TCL_OK) { - return ret; - } - cmdPtr = ociPtr->cmdPtr; - *rPtr = cmdPtr; - return TCL_OK; - } - } - } - } - } - return TCL_CONTINUE; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassVarResolver() - * - * Used by the class namespaces to handle name resolution for runtime - * variable accesses. This procedure looks for references to both - * common variables and instance variables at runtime. It is used as - * a second line of defense, to handle references that could not be - * resolved as compiled locals. - * - * If a variable is found, this procedure returns TCL_OK along with - * the appropriate Tcl variable in the rPtr argument. If a particular - * variable is private, this procedure returns TCL_ERROR and access - * to the variable is denied. If a variable is not recognized, this - * procedure returns TCL_CONTINUE, and lookup continues via the normal - * Tcl name resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassVarResolver2( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - int flags, /* TCL_LEAVE_ERR_MSG => leave error messages - * in interp if anything goes wrong */ - Tcl_Var *rPtr) /* returns: resolved variable */ -{ - ItclObjectInfo *infoPtr; - ItclClass *iclsPtr; - ItclObject *contextIoPtr; - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - - Tcl_Var varPtr; - ItclResolvingInfo *iriPtr; - ObjectVarTableInfo *ovtiPtr; - ObjectVarInfo *oviPtr; - - Tcl_Namespace *upNsPtr; - upNsPtr = Itcl_GetUplevelNamespace(interp, 1); - - /* - * If this is a global variable, handle it in the usual - * Tcl manner. - */ - if (flags & TCL_GLOBAL_ONLY) { - return TCL_CONTINUE; - } - - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - - /* - * See if this is a formal parameter in the current proc scope. - * If so, that variable has precedence. Look it up and return - * it here. This duplicates some of the functionality of - * TclLookupVar, but we return it here (instead of returning - * TCL_CONTINUE) to avoid looking it up again later. - */ - ItclCallContext *callContextPtr; - callContextPtr = Itcl_PeekStack(&infoPtr->contextStack); - if ((strstr(name,"::") == NULL) && - Itcl_IsCallFrameArgument(interp, name)) { - return TCL_CONTINUE; - } - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_FindHashEntry(&iriPtr->resolveVars , nsPtr->fullName); - if (hPtr != NULL) { - Tcl_HashTable *tablePtr; - tablePtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(tablePtr , name); - if (hPtr != NULL) { - int ret; - ItclClassVarInfo *icviPtr = Tcl_GetHashValue(hPtr); - ret = (* iriPtr->varProtFcn)(interp, - Tcl_GetCurrentNamespace(interp), name, - (ClientData)icviPtr); - if (ret != TCL_OK) { - return ret; - } - /* - * If this is an instance variable, then we have to - * find the object context, - */ - - if ((callContextPtr != NULL) && (callContextPtr->ioPtr != NULL)) { - contextIoPtr = callContextPtr->ioPtr; - hPtr = Tcl_FindHashEntry(&iriPtr->objectVarsTables, - (char *)contextIoPtr); - if (hPtr != NULL) { - ovtiPtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(&ovtiPtr->varInfos, - (char *)icviPtr); - if (hPtr != NULL) { - oviPtr = Tcl_GetHashValue(hPtr); - varPtr = oviPtr->varPtr; - *rPtr = varPtr; - return TCL_OK; - } - } - } - } - } - /* - * See if the variable is a known data member and accessible. - */ - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, name); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - if (!vlookup->accessible) { - return TCL_CONTINUE; - } - - /* - * If this is a common data member, then its variable - * is easy to find. Return it directly. - */ - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - *rPtr = Tcl_GetHashValue(hPtr); - return TCL_OK; - } - } - - return TCL_CONTINUE; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_ClassCompiledVarResolver() - * - * Used by the class namespaces to handle name resolution for compile - * time variable accesses. This procedure looks for references to - * both common variables and instance variables at compile time. If - * the variables are found, they are characterized in a generic way - * by their ItclVarLookup record. At runtime, Tcl constructs the - * compiled local variables by calling ItclClassRuntimeVarResolver. - * - * If a variable is found, this procedure returns TCL_OK along with - * information about the variable in the rPtr argument. If a particular - * variable is private, this procedure returns TCL_ERROR and access - * to the variable is denied. If a variable is not recognized, this - * procedure returns TCL_CONTINUE, and lookup continues via the normal - * Tcl name resolution rules. - * ------------------------------------------------------------------------ - */ -int -Itcl_ClassCompiledVarResolver2( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - int length, /* number of characters in name */ - Tcl_Namespace *nsPtr, /* namespace performing the resolution */ - Tcl_ResolvedVarInfo **rPtr) /* returns: info that makes it possible to - * resolve the variable at runtime */ -{ - ItclClass *iclsPtr; - ItclObjectInfo *infoPtr; - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - char *buffer; - char storage[64]; - - infoPtr = (ItclObjectInfo *)Tcl_GetAssocData(interp, - ITCL_INTERP_DATA, NULL); - hPtr = Tcl_FindHashEntry(&infoPtr->namespaceClasses, (char *)nsPtr); - if (hPtr == NULL) { - return TCL_CONTINUE; - } - iclsPtr = Tcl_GetHashValue(hPtr); - /* - * Copy the name to local storage so we can NULL terminate it. - * If the name is long, allocate extra space for it. - */ - if (length < sizeof(storage)) { - buffer = storage; - } else { - buffer = (char*)ckalloc((unsigned)(length+1)); - } - memcpy((void*)buffer, (void*)name, (size_t)length); - buffer[length] = '\0'; - - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, buffer); - - if (buffer != storage) { - ckfree(buffer); - } - - /* - * If the name is not found, or if it is inaccessible, - * continue on with the normal Tcl name resolution rules. - */ - if (hPtr == NULL) { - return TCL_CONTINUE; - } - - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - if (!vlookup->accessible) { - return TCL_CONTINUE; - } - - /* - * Return the ItclVarLookup record. At runtime, Tcl will - * call ItclClassRuntimeVarResolver with this record, to - * plug in the appropriate variable for the current object - * context. - */ - (*rPtr) = (Tcl_ResolvedVarInfo *) ckalloc(sizeof(ItclResolvedVarInfo)); - (*rPtr)->fetchProc = ItclClassRuntimeVarResolver2; - (*rPtr)->deleteProc = NULL; - ((ItclResolvedVarInfo*)(*rPtr))->vlookup = vlookup; - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * ItclClassRuntimeVarResolver() - * - * Invoked when Tcl sets up the call frame for an [incr Tcl] method/proc - * at runtime. Resolves data members identified earlier by - * Itcl_ClassCompiledVarResolver. Returns the Tcl_Var representation - * for the data member. - * ------------------------------------------------------------------------ - */ -static Tcl_Var -ItclClassRuntimeVarResolver2( - Tcl_Interp *interp, /* current interpreter */ - Tcl_ResolvedVarInfo *resVarInfo) /* contains ItclVarLookup rep - * for variable */ -{ - ItclVarLookup *vlookup = ((ItclResolvedVarInfo*)resVarInfo)->vlookup; - - ItclClass *iclsPtr; - ItclObject *contextIoPtr; - Tcl_HashEntry *hPtr; - - Tcl_Var varPtr; - ItclResolvingInfo *iriPtr; - ObjectVarTableInfo *ovtiPtr; - ObjectVarInfo *oviPtr; - - /* - * If this is a common data member, then the associated - * variable is known directly. - */ - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - return Tcl_GetHashValue(hPtr); - } - } - iclsPtr = vlookup->ivPtr->iclsPtr; - - /* - * Otherwise, get the current object context and find the - * variable in its data table. - * - * TRICKY NOTE: Get the index for this variable using the - * virtual table for the MOST-SPECIFIC class. - */ - - ItclCallContext *callContextPtr; - - callContextPtr = Itcl_PeekStack(&iclsPtr->infoPtr->contextStack); - if (callContextPtr == NULL) { - return NULL; - } - if (callContextPtr->ioPtr == NULL) { - return NULL; - } - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_FindHashEntry(&iriPtr->resolveVars, - Tcl_GetCurrentNamespace(interp)->fullName); - if (hPtr != NULL) { - Tcl_HashTable *tablePtr; - tablePtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(tablePtr, - Tcl_GetString(vlookup->ivPtr->namePtr)); - if (hPtr != NULL) { - ItclClassVarInfo *icviPtr = Tcl_GetHashValue(hPtr); - int ret; - ret = (* iriPtr->varProtFcn)(interp, - Tcl_GetCurrentNamespace(interp), - Tcl_GetString(vlookup->ivPtr->namePtr), - (ClientData)icviPtr); - if (ret != TCL_OK) { - return NULL; - } - /* - * If this is an instance variable, then we have to - * find the object context, - */ - - contextIoPtr = callContextPtr->ioPtr; - hPtr = Tcl_FindHashEntry(&iriPtr->objectVarsTables, (char *)contextIoPtr); - if (hPtr != NULL) { - ovtiPtr = Tcl_GetHashValue(hPtr); - hPtr = Tcl_FindHashEntry(&ovtiPtr->varInfos, (char *)icviPtr); - if (hPtr != NULL) { - oviPtr = Tcl_GetHashValue(hPtr); - varPtr = oviPtr->varPtr; - return varPtr; - } - } - } - } - return NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ParseVarResolver() - * - * Used by the "parser" namespace to resolve variable accesses to - * common variables. The runtime resolver procedure is consulted - * whenever a variable is accessed within the namespace. It can - * deny access to certain variables, or perform special lookups itself. - * - * This procedure allows access only to "common" class variables that - * have been declared within the class or inherited from another class. - * A "set" command can be used to initialized common data members within - * the body of the class definition itself: - * - * itcl::class Foo { - * common colors - * set colors(red) #ff0000 - * set colors(green) #00ff00 - * set colors(blue) #0000ff - * ... - * } - * - * itcl::class Bar { - * inherit Foo - * set colors(gray) #a0a0a0 - * set colors(white) #ffffff - * - * common numbers - * set numbers(0) zero - * set numbers(1) one - * } - * - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -int -Itcl_ParseVarResolver2( - Tcl_Interp *interp, /* current interpreter */ - const char* name, /* name of the variable being accessed */ - Tcl_Namespace *contextNs, /* namespace context */ - int flags, /* TCL_GLOBAL_ONLY => global variable - * TCL_NAMESPACE_ONLY => namespace variable */ - Tcl_Var* rPtr) /* returns: Tcl_Var for desired variable */ -{ - ItclObjectInfo *infoPtr = (ItclObjectInfo*)contextNs->clientData; - ItclClass *iclsPtr = (ItclClass*)Itcl_PeekStack(&infoPtr->clsStack); - - Tcl_HashEntry *hPtr; - ItclVarLookup *vlookup; - - /* - * See if the requested variable is a recognized "common" member. - * If it is, make sure that access is allowed. - */ - hPtr = Tcl_FindHashEntry(&iclsPtr->resolveVars, name); - if (hPtr) { - vlookup = (ItclVarLookup*)Tcl_GetHashValue(hPtr); - - if ((vlookup->ivPtr->flags & ITCL_COMMON) != 0) { - if (!vlookup->accessible) { - Tcl_AppendResult(interp, - "can't access \"", name, "\": ", - Itcl_ProtectionStr(vlookup->ivPtr->protection), - " variable", - (char*)NULL); - return TCL_ERROR; - } - hPtr = Tcl_FindHashEntry(&vlookup->ivPtr->iclsPtr->classCommons, - (char *)vlookup->ivPtr); - if (hPtr != NULL) { - *rPtr = Tcl_GetHashValue(hPtr); - return TCL_OK; - } - } - } - - /* - * If the variable is not recognized, return TCL_CONTINUE and - * let lookup continue via the normal name resolution rules. - * This is important for variables like "errorInfo" - * that might get set while the parser namespace is active. - */ - return TCL_CONTINUE; -} - - - -int -ItclSetParserResolver2( - Tcl_Namespace *nsPtr) -{ - Itcl_SetNamespaceResolvers(nsPtr, (Tcl_ResolveCmdProc*)NULL, - Itcl_ParseVarResolver2, (Tcl_ResolveCompiledVarProc*)NULL); - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubInit.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclStubInit.c deleted file mode 100644 index 63d6437..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubInit.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * This file is (mostly) automatically generated from itcl.decls. - * It is compiled and linked in with the itcl package proper. - */ - -#include "itclInt.h" - -MODULE_SCOPE const ItclStubs itclStubs; -/* !BEGIN!: Do not edit below this line. */ - -static const ItclIntStubs itclIntStubs = { - TCL_STUB_MAGIC, - ITCLINT_STUBS_EPOCH, - ITCLINT_STUBS_REVISION, - 0, - Itcl_IsClassNamespace, /* 0 */ - Itcl_IsClass, /* 1 */ - Itcl_FindClass, /* 2 */ - Itcl_FindObject, /* 3 */ - Itcl_IsObject, /* 4 */ - Itcl_ObjectIsa, /* 5 */ - Itcl_Protection, /* 6 */ - Itcl_ProtectionStr, /* 7 */ - Itcl_CanAccess, /* 8 */ - Itcl_CanAccessFunc, /* 9 */ - 0, /* 10 */ - Itcl_ParseNamespPath, /* 11 */ - Itcl_DecodeScopedCommand, /* 12 */ - Itcl_EvalArgs, /* 13 */ - Itcl_CreateArgs, /* 14 */ - 0, /* 15 */ - 0, /* 16 */ - Itcl_GetContext, /* 17 */ - Itcl_InitHierIter, /* 18 */ - Itcl_DeleteHierIter, /* 19 */ - Itcl_AdvanceHierIter, /* 20 */ - Itcl_FindClassesCmd, /* 21 */ - Itcl_FindObjectsCmd, /* 22 */ - 0, /* 23 */ - Itcl_DelClassCmd, /* 24 */ - Itcl_DelObjectCmd, /* 25 */ - Itcl_ScopeCmd, /* 26 */ - Itcl_CodeCmd, /* 27 */ - Itcl_StubCreateCmd, /* 28 */ - Itcl_StubExistsCmd, /* 29 */ - Itcl_IsStub, /* 30 */ - Itcl_CreateClass, /* 31 */ - Itcl_DeleteClass, /* 32 */ - Itcl_FindClassNamespace, /* 33 */ - Itcl_HandleClass, /* 34 */ - 0, /* 35 */ - 0, /* 36 */ - 0, /* 37 */ - Itcl_BuildVirtualTables, /* 38 */ - Itcl_CreateVariable, /* 39 */ - Itcl_DeleteVariable, /* 40 */ - Itcl_GetCommonVar, /* 41 */ - 0, /* 42 */ - 0, /* 43 */ - Itcl_CreateObject, /* 44 */ - Itcl_DeleteObject, /* 45 */ - Itcl_DestructObject, /* 46 */ - 0, /* 47 */ - Itcl_GetInstanceVar, /* 48 */ - 0, /* 49 */ - Itcl_BodyCmd, /* 50 */ - Itcl_ConfigBodyCmd, /* 51 */ - Itcl_CreateMethod, /* 52 */ - Itcl_CreateProc, /* 53 */ - Itcl_CreateMemberFunc, /* 54 */ - Itcl_ChangeMemberFunc, /* 55 */ - Itcl_DeleteMemberFunc, /* 56 */ - Itcl_CreateMemberCode, /* 57 */ - Itcl_DeleteMemberCode, /* 58 */ - Itcl_GetMemberCode, /* 59 */ - 0, /* 60 */ - Itcl_EvalMemberCode, /* 61 */ - 0, /* 62 */ - 0, /* 63 */ - 0, /* 64 */ - 0, /* 65 */ - 0, /* 66 */ - Itcl_GetMemberFuncUsage, /* 67 */ - Itcl_ExecMethod, /* 68 */ - Itcl_ExecProc, /* 69 */ - 0, /* 70 */ - Itcl_ConstructBase, /* 71 */ - Itcl_InvokeMethodIfExists, /* 72 */ - 0, /* 73 */ - Itcl_ReportFuncErrors, /* 74 */ - Itcl_ParseInit, /* 75 */ - Itcl_ClassCmd, /* 76 */ - Itcl_ClassInheritCmd, /* 77 */ - Itcl_ClassProtectionCmd, /* 78 */ - Itcl_ClassConstructorCmd, /* 79 */ - Itcl_ClassDestructorCmd, /* 80 */ - Itcl_ClassMethodCmd, /* 81 */ - Itcl_ClassProcCmd, /* 82 */ - Itcl_ClassVariableCmd, /* 83 */ - Itcl_ClassCommonCmd, /* 84 */ - Itcl_ParseVarResolver, /* 85 */ - Itcl_BiInit, /* 86 */ - Itcl_InstallBiMethods, /* 87 */ - Itcl_BiIsaCmd, /* 88 */ - Itcl_BiConfigureCmd, /* 89 */ - Itcl_BiCgetCmd, /* 90 */ - Itcl_BiChainCmd, /* 91 */ - Itcl_BiInfoClassCmd, /* 92 */ - Itcl_BiInfoInheritCmd, /* 93 */ - Itcl_BiInfoHeritageCmd, /* 94 */ - Itcl_BiInfoFunctionCmd, /* 95 */ - Itcl_BiInfoVariableCmd, /* 96 */ - Itcl_BiInfoBodyCmd, /* 97 */ - Itcl_BiInfoArgsCmd, /* 98 */ - 0, /* 99 */ - Itcl_EnsembleInit, /* 100 */ - Itcl_CreateEnsemble, /* 101 */ - Itcl_AddEnsemblePart, /* 102 */ - Itcl_GetEnsemblePart, /* 103 */ - Itcl_IsEnsemble, /* 104 */ - Itcl_GetEnsembleUsage, /* 105 */ - Itcl_GetEnsembleUsageForObj, /* 106 */ - Itcl_EnsembleCmd, /* 107 */ - Itcl_EnsPartCmd, /* 108 */ - Itcl_EnsembleErrorCmd, /* 109 */ - 0, /* 110 */ - 0, /* 111 */ - 0, /* 112 */ - 0, /* 113 */ - 0, /* 114 */ - Itcl_Assert, /* 115 */ - Itcl_IsObjectCmd, /* 116 */ - Itcl_IsClassCmd, /* 117 */ - 0, /* 118 */ - 0, /* 119 */ - 0, /* 120 */ - 0, /* 121 */ - 0, /* 122 */ - 0, /* 123 */ - 0, /* 124 */ - 0, /* 125 */ - 0, /* 126 */ - 0, /* 127 */ - 0, /* 128 */ - 0, /* 129 */ - 0, /* 130 */ - 0, /* 131 */ - 0, /* 132 */ - 0, /* 133 */ - 0, /* 134 */ - 0, /* 135 */ - 0, /* 136 */ - 0, /* 137 */ - 0, /* 138 */ - 0, /* 139 */ - Itcl_FilterAddCmd, /* 140 */ - Itcl_FilterDeleteCmd, /* 141 */ - Itcl_ForwardAddCmd, /* 142 */ - Itcl_ForwardDeleteCmd, /* 143 */ - Itcl_MixinAddCmd, /* 144 */ - Itcl_MixinDeleteCmd, /* 145 */ - 0, /* 146 */ - 0, /* 147 */ - 0, /* 148 */ - 0, /* 149 */ - 0, /* 150 */ - Itcl_BiInfoUnknownCmd, /* 151 */ - Itcl_BiInfoVarsCmd, /* 152 */ - Itcl_CanAccess2, /* 153 */ - 0, /* 154 */ - 0, /* 155 */ - 0, /* 156 */ - 0, /* 157 */ - 0, /* 158 */ - 0, /* 159 */ - Itcl_SetCallFrameResolver, /* 160 */ - ItclEnsembleSubCmd, /* 161 */ - Itcl_GetUplevelNamespace, /* 162 */ - Itcl_GetCallFrameClientData, /* 163 */ - 0, /* 164 */ - Itcl_SetCallFrameNamespace, /* 165 */ - Itcl_GetCallFrameObjc, /* 166 */ - Itcl_GetCallFrameObjv, /* 167 */ - Itcl_NWidgetCmd, /* 168 */ - Itcl_AddOptionCmd, /* 169 */ - Itcl_AddComponentCmd, /* 170 */ - Itcl_BiInfoOptionCmd, /* 171 */ - Itcl_BiInfoComponentCmd, /* 172 */ - Itcl_RenameCommand, /* 173 */ - Itcl_PushCallFrame, /* 174 */ - Itcl_PopCallFrame, /* 175 */ - Itcl_GetUplevelCallFrame, /* 176 */ - Itcl_ActivateCallFrame, /* 177 */ - ItclSetInstanceVar, /* 178 */ - ItclCapitalize, /* 179 */ - ItclClassBaseCmd, /* 180 */ - ItclCreateComponent, /* 181 */ - Itcl_SetContext, /* 182 */ - Itcl_UnsetContext, /* 183 */ - ItclGetInstanceVar, /* 184 */ -}; - -static const ItclStubHooks itclStubHooks = { - &itclIntStubs -}; - -const ItclStubs itclStubs = { - TCL_STUB_MAGIC, - ITCL_STUBS_EPOCH, - ITCL_STUBS_REVISION, - &itclStubHooks, - 0, /* 0 */ - 0, /* 1 */ - Itcl_RegisterC, /* 2 */ - Itcl_RegisterObjC, /* 3 */ - Itcl_FindC, /* 4 */ - Itcl_InitStack, /* 5 */ - Itcl_DeleteStack, /* 6 */ - Itcl_PushStack, /* 7 */ - Itcl_PopStack, /* 8 */ - Itcl_PeekStack, /* 9 */ - Itcl_GetStackValue, /* 10 */ - Itcl_InitList, /* 11 */ - Itcl_DeleteList, /* 12 */ - Itcl_CreateListElem, /* 13 */ - Itcl_DeleteListElem, /* 14 */ - Itcl_InsertList, /* 15 */ - Itcl_InsertListElem, /* 16 */ - Itcl_AppendList, /* 17 */ - Itcl_AppendListElem, /* 18 */ - Itcl_SetListValue, /* 19 */ - Itcl_EventuallyFree, /* 20 */ - Itcl_PreserveData, /* 21 */ - Itcl_ReleaseData, /* 22 */ - Itcl_SaveInterpState, /* 23 */ - Itcl_RestoreInterpState, /* 24 */ - Itcl_DiscardInterpState, /* 25 */ -}; - -/* !END!: Do not edit above this line. */ diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubLib.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclStubLib.c deleted file mode 100644 index 50683b7..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubLib.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SOURCE: tk/generic/tkStubLib.c, version 1.9 2004/03/17 - */ - -#define USE_TCL_STUBS 1 -#define USE_ITCL_STUBS 1 -#include "itclInt.h" - -#undef Itcl_InitStubs - -MODULE_SCOPE const ItclStubs *itclStubsPtr; -MODULE_SCOPE const ItclIntStubs *itclIntStubsPtr; - -const ItclStubs *itclStubsPtr = NULL; -const ItclIntStubs *itclIntStubsPtr = NULL; - -/* - *---------------------------------------------------------------------- - * - * Itcl_InitStubs -- - * Load the tclOO package, initialize stub table pointer. Do not call - * this function directly, use Itcl_InitStubs() macro instead. - * - * Results: - * The actual version of the package that satisfies the request, or - * NULL to indicate that an error occurred. - * - * Side effects: - * Sets the stub table pointer. - * - */ - -const char * -Itcl_InitStubs( - Tcl_Interp *interp, - const char *version, - int exact) -{ - const char *packageName = "itcl"; - const char *errMsg = NULL; - ClientData clientData = NULL; - const ItclStubs *stubsPtr; - const ItclIntStubs *intStubsPtr; - const char *actualVersion; - - actualVersion = - Tcl_PkgRequireEx(interp, packageName, version, exact, &clientData); - stubsPtr = clientData; - if ((actualVersion == NULL) || (clientData == NULL)) { - return NULL; - } - intStubsPtr = stubsPtr->hooks ? - stubsPtr->hooks->itclIntStubs : NULL; - - if (!stubsPtr || !intStubsPtr) { - errMsg = "missing stub table pointer"; - goto error; - } - itclStubsPtr = stubsPtr; - itclIntStubsPtr = intStubsPtr; - return actualVersion; - - error: - Tcl_ResetResult(interp); - Tcl_AppendResult(interp, "Error loading ", packageName, " package", - " (requested version '", version, "', loaded version '", - actualVersion, "'): ", errMsg, NULL); - return NULL; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubs.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclStubs.c deleted file mode 100644 index bc7189c..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclStubs.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * itclStubs.c -- - * - * This file contains the C-implemeted part of Itcl object-system - * Itcl - * - * Copyright (c) 2006 by Arnulf P. Wiedemann - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include "itclInt.h" - -static void ItclDeleteStub(ClientData cdata); -static int ItclHandleStubCmd(ClientData clientData, Tcl_Interp *interp, - int objc, Tcl_Obj *const objv[]); - - -/* - * ------------------------------------------------------------------------ - * Itcl_IsStub() - * - * Checks the given Tcl command to see if it represents an autoloading - * stub created by the "stub create" command. Returns non-zero if - * the command is indeed a stub. - * ------------------------------------------------------------------------ - */ -int -Itcl_IsStub( - Tcl_Command cmdPtr) /* command being tested */ -{ - Tcl_CmdInfo cmdInfo; - - /* - * This may be an imported command, but don't try to get the - * original. Just check to see if this particular command - * is a stub. If we really want the original command, we'll - * find it at a higher level. - */ - if (Tcl_GetCommandInfoFromToken(cmdPtr, &cmdInfo) == 1) { - if (cmdInfo.deleteProc == ItclDeleteStub) { - return 1; - } - } - return 0; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_StubCreateCmd() - * - * Invoked by Tcl whenever the user issues a "stub create" command to - * create an autoloading stub for imported commands. Handles the - * following syntax: - * - * stub create <name> - * - * Creates a command called <name>. Executing this command will cause - * the real command <name> to be autoloaded. - * ------------------------------------------------------------------------ - */ -int -Itcl_StubCreateCmd( - ClientData clientData, /* not used */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Command cmdPtr; - char *cmdName; - Tcl_CmdInfo cmdInfo; - - ItclShowArgs(1, "Itcl_StubCreateCmd", objc, objv); - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "name"); - return TCL_ERROR; - } - cmdName = Tcl_GetString(objv[1]); - - /* - * Create a stub command with the characteristic ItclDeleteStub - * procedure. That way, we can recognize this command later - * on as a stub. Save the cmd token as client data, so we can - * get the full name of this command later on. - */ - cmdPtr = Tcl_CreateObjCommand(interp, cmdName, - ItclHandleStubCmd, (ClientData)NULL, - (Tcl_CmdDeleteProc*)ItclDeleteStub); - - Tcl_GetCommandInfoFromToken(cmdPtr, &cmdInfo); - cmdInfo.objClientData = cmdPtr; - Tcl_SetCommandInfoFromToken(cmdPtr, &cmdInfo); - - return TCL_OK; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_StubExistsCmd() - * - * Invoked by Tcl whenever the user issues a "stub exists" command to - * see if an existing command is an autoloading stub. Handles the - * following syntax: - * - * stub exists <name> - * - * Looks for a command called <name> and checks to see if it is an - * autoloading stub. Returns a boolean result. - * ------------------------------------------------------------------------ - */ -int -Itcl_StubExistsCmd( - ClientData clientData, /* not used */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Command cmdPtr; - char *cmdName; - - if (objc != 2) { - Tcl_WrongNumArgs(interp, 1, objv, "name"); - return TCL_ERROR; - } - cmdName = Tcl_GetString(objv[1]); - - cmdPtr = Tcl_FindCommand(interp, cmdName, (Tcl_Namespace*)NULL, 0); - - if ((cmdPtr != NULL) && Itcl_IsStub(cmdPtr)) { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); - } else { - Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); - } - return TCL_OK; -} - -/* - * ------------------------------------------------------------------------ - * ItclHandleStubCmd() - * - * Invoked by Tcl to handle commands created by "stub create". - * Calls "auto_load" with the full name of the current command to - * trigger autoloading of the real implementation. Then, calls the - * command to handle its function. If successful, this command - * returns TCL_OK along with the result from the real implementation - * of this command. Otherwise, it returns TCL_ERROR, along with an - * error message in the interpreter. - * ------------------------------------------------------------------------ - */ -static int -ItclHandleStubCmd( - ClientData clientData, /* command token for this stub */ - Tcl_Interp *interp, /* current interpreter */ - int objc, /* number of arguments */ - Tcl_Obj *const objv[]) /* argument objects */ -{ - Tcl_Command cmdPtr; - Tcl_Obj **cmdlinev; - Tcl_Obj *objAutoLoad[2]; - Tcl_Obj *objPtr; - Tcl_Obj *cmdNamePtr; - Tcl_Obj *cmdlinePtr; - char *cmdName; - int result; - int loaded; - int cmdlinec; - - ItclShowArgs(1, "ItclHandleStubCmd", objc, objv); - cmdPtr = (Tcl_Command) clientData; - cmdNamePtr = Tcl_NewStringObj((char*)NULL, 0); - Tcl_IncrRefCount(cmdNamePtr); - Tcl_GetCommandFullName(interp, cmdPtr, cmdNamePtr); - cmdName = Tcl_GetString(cmdNamePtr); - - /* - * Try to autoload the real command for this stub. - */ - objAutoLoad[0] = Tcl_NewStringObj("::auto_load", -1); - objAutoLoad[1] = cmdNamePtr; - result = Tcl_EvalObjv(interp, 2, objAutoLoad, 0); - if (result != TCL_OK) { - Tcl_DecrRefCount(cmdNamePtr); - return TCL_ERROR; - } - - objPtr = Tcl_GetObjResult(interp); - result = Tcl_GetIntFromObj(interp, objPtr, &loaded); - if ((result != TCL_OK) || !loaded) { - Tcl_ResetResult(interp); - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "can't autoload \"", cmdName, "\"", (char*)NULL); - Tcl_DecrRefCount(cmdNamePtr); - return TCL_ERROR; - } - - /* - * At this point, the real implementation has been loaded. - * Invoke the command again with the arguments passed in. - */ - cmdlinePtr = Itcl_CreateArgs(interp, cmdName, objc - 1, objv + 1); - (void) Tcl_ListObjGetElements((Tcl_Interp*)NULL, cmdlinePtr, - &cmdlinec, &cmdlinev); - - Tcl_DecrRefCount(cmdNamePtr); - Tcl_ResetResult(interp); - ItclShowArgs(1, "ItclHandleStubCmd", cmdlinec - 1, cmdlinev + 1); - result = Tcl_EvalObjv(interp, cmdlinec - 1, cmdlinev + 1, TCL_EVAL_DIRECT); - Tcl_DecrRefCount(cmdlinePtr); - Tcl_DecrRefCount(objAutoLoad[0]); - return result; -} - - -/* - * ------------------------------------------------------------------------ - * ItclDeleteStub() - * - * Invoked by Tcl whenever a stub command is deleted. This procedure - * does nothing, but its presence identifies a command as a stub. - * ------------------------------------------------------------------------ - */ -/* ARGSUSED */ -static void -ItclDeleteStub( - ClientData cdata) /* not used */ -{ - /* do nothing */ -} - diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.c deleted file mode 100644 index 7d3cdf4..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * This file contains procedures that use the internal Tcl core stubs - * entries. - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include <tclInt.h> -#include "itclInt.h" - -Tcl_Command -_Tcl_GetOriginalCommand( - Tcl_Command command) -{ - return TclGetOriginalCommand(command); -} - -int -_Tcl_CreateProc( - Tcl_Interp *interp, /* Interpreter containing proc. */ - Tcl_Namespace *nsPtr, /* Namespace containing this proc. */ - const char *procName, /* Unqualified name of this proc. */ - Tcl_Obj *argsPtr, /* Description of arguments. */ - Tcl_Obj *bodyPtr, /* Command body. */ - Tcl_Proc *procPtrPtr) /* Returns: pointer to proc data. */ -{ - int code = TclCreateProc(interp, (Namespace *)nsPtr, procName, argsPtr, - bodyPtr, (Proc **)procPtrPtr); - (*(Proc **)procPtrPtr)->cmdPtr = NULL; - return code; -} - -void * -_Tcl_GetObjInterpProc( - void) -{ - return (void *)TclGetObjInterpProc(); -} - -void -_Tcl_ProcDeleteProc( - ClientData clientData) -{ - TclProcDeleteProc(clientData); -} - -int -Itcl_RenameCommand( - Tcl_Interp *interp, - const char *oldName, - const char *newName) -{ - return TclRenameCommand(interp, oldName, newName); -} - -int -Itcl_PushCallFrame( - Tcl_Interp * interp, - Tcl_CallFrame * framePtr, - Tcl_Namespace * nsPtr, - int isProcCallFrame) -{ - return Tcl_PushCallFrame(interp, framePtr, nsPtr, isProcCallFrame); -} - -void -Itcl_PopCallFrame( - Tcl_Interp * interp) -{ - Tcl_PopCallFrame(interp); -} - -void -Itcl_GetVariableFullName( - Tcl_Interp * interp, - Tcl_Var variable, - Tcl_Obj * objPtr) -{ - Tcl_GetVariableFullName(interp, variable, objPtr); -} - -Tcl_Var -Itcl_FindNamespaceVar( - Tcl_Interp * interp, - const char * name, - Tcl_Namespace * contextNsPtr, - int flags) -{ - return Tcl_FindNamespaceVar(interp, name, contextNsPtr, flags); -} - -void -Itcl_SetNamespaceResolvers ( - Tcl_Namespace * namespacePtr, - Tcl_ResolveCmdProc * cmdProc, - Tcl_ResolveVarProc * varProc, - Tcl_ResolveCompiledVarProc * compiledVarProc) -{ - Tcl_SetNamespaceResolvers(namespacePtr, cmdProc, varProc, compiledVarProc); -} - -Tcl_HashTable * -Itcl_GetNamespaceCommandTable( - Tcl_Namespace *nsPtr) -{ - return TclGetNamespaceCommandTable(nsPtr); -} - -Tcl_HashTable * -Itcl_GetNamespaceChildTable( - Tcl_Namespace *nsPtr) -{ - return TclGetNamespaceChildTable(nsPtr); -} - -int -Itcl_InitRewriteEnsemble( - Tcl_Interp *interp, - int numRemoved, - int numInserted, - int objc, - Tcl_Obj *const *objv) -{ - return TclInitRewriteEnsemble(interp, numRemoved, numInserted, objv); -} - -void -Itcl_ResetRewriteEnsemble( - Tcl_Interp *interp, - int isRootEnsemble) -{ - TclResetRewriteEnsemble(interp, isRootEnsemble); -} - - diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.h deleted file mode 100644 index b22ee06..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclTclIntStubsFcn.h +++ /dev/null @@ -1,38 +0,0 @@ -/* these functions are Tcl internal stubs so make an Itcl_* wrapper */ -MODULE_SCOPE void Itcl_GetVariableFullName (Tcl_Interp * interp, - Tcl_Var variable, Tcl_Obj * objPtr); -MODULE_SCOPE Tcl_Var Itcl_FindNamespaceVar (Tcl_Interp * interp, - const char * name, Tcl_Namespace * contextNsPtr, int flags); -MODULE_SCOPE void Itcl_SetNamespaceResolvers (Tcl_Namespace * namespacePtr, - Tcl_ResolveCmdProc * cmdProc, Tcl_ResolveVarProc * varProc, - Tcl_ResolveCompiledVarProc * compiledVarProc); - -#ifndef _TCL_PROC_DEFINED -typedef struct Tcl_Proc_ *Tcl_Proc; -#define _TCL_PROC_DEFINED 1 -#endif -#ifndef _TCL_RESOLVE_DEFINED -struct Tcl_Resolve; -#endif - -#define Tcl_GetOriginalCommand _Tcl_GetOriginalCommand -#define Tcl_CreateProc _Tcl_CreateProc -#define Tcl_ProcDeleteProc _Tcl_ProcDeleteProc -#define Tcl_GetObjInterpProc _Tcl_GetObjInterpProc - -MODULE_SCOPE Tcl_Command _Tcl_GetOriginalCommand(Tcl_Command command); -MODULE_SCOPE int _Tcl_CreateProc(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - const char *procName, Tcl_Obj *argsPtr, Tcl_Obj *bodyPtr, - Tcl_Proc *procPtrPtr); -MODULE_SCOPE void _Tcl_ProcDeleteProc(ClientData clientData); -MODULE_SCOPE void *_Tcl_GetObjInterpProc(void); -MODULE_SCOPE int Tcl_RenameCommand(Tcl_Interp *interp, const char *oldName, - const char *newName); -MODULE_SCOPE Tcl_HashTable *Itcl_GetNamespaceChildTable(Tcl_Namespace *nsPtr); -MODULE_SCOPE Tcl_HashTable *Itcl_GetNamespaceCommandTable(Tcl_Namespace *nsPtr); -MODULE_SCOPE int Itcl_InitRewriteEnsemble(Tcl_Interp *interp, int numRemoved, - int numInserted, int objc, Tcl_Obj *const *objv); -MODULE_SCOPE void Itcl_ResetRewriteEnsemble(Tcl_Interp *interp, - int isRootEnsemble); - - diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclTestRegisterC.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclTestRegisterC.c deleted file mode 100644 index 7489b89..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclTestRegisterC.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This part adds a mechanism for integrating C procedures into - * [incr Tcl] classes as methods and procs. Each C procedure must - * either be declared via Itcl_RegisterC() or dynamically loaded. - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) Arnulf Wiedemann - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#ifdef ITCL_DEBUG_C_INTERFACE - -#include <stdio.h> -#include "itclInt.h" - -Tcl_CmdProc cArgFunc; -Tcl_ObjCmdProc cObjFunc; - -int -cArgFunc( - ClientData clientData, - Tcl_Interp *interp, - int argc, - const char **argv) -{ - int result; - ItclObjectInfo * infoPtr = NULL; - ItclClass *iclsPtr = NULL; - ItclClass * classPtr; - ItclObject * rioPtr = (ItclObject *)1; - Tcl_Obj * objv[4]; - FOREACH_HASH_DECLS; - -//fprintf(stderr, "argc: %d\n", argc); - if (argc != 4) { - Tcl_AppendResult(interp, "wrong #args: should be ::itcl::parser::handleClass className className objectName", NULL); - return TCL_ERROR; - } - objv[0] = Tcl_NewStringObj(argv[0], -1); - objv[1] = Tcl_NewStringObj(argv[1], -1); /* class name */ - objv[2] = Tcl_NewStringObj(argv[2], -1); /* full class name */ - objv[3] = Tcl_NewStringObj(argv[3], -1); /* object name */ - Tcl_IncrRefCount(objv[0]); - Tcl_IncrRefCount(objv[1]); - Tcl_IncrRefCount(objv[2]); - Tcl_IncrRefCount(objv[3]); - infoPtr = (ClientData)Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - FOREACH_HASH_VALUE(classPtr,&infoPtr->nameClasses) { - if (strcmp(Tcl_GetString(objv[1]), Tcl_GetString(classPtr->fullNamePtr)) == 0 || - strcmp(Tcl_GetString(objv[2]), Tcl_GetString(classPtr->fullNamePtr)) == 0) { - iclsPtr = classPtr; - break; - } - } - if (iclsPtr == NULL) { - Tcl_AppendResult(interp, "no such class: ", Tcl_GetString(objv[2]), NULL); - return TCL_ERROR; - } - - /* try to create an object for a class as a test for calling a C function from - * an Itcl class. See file CreateItclObjectWithC_example.tcl in library directory - */ - result = Itcl_CreateObject(interp, Tcl_GetString(objv[3]), iclsPtr, 4, objv, &rioPtr); - return result; -} - -int -cObjFunc( - ClientData clientData, - Tcl_Interp *interp, - int objc, - Tcl_Obj *const *objv) -{ - Tcl_Namespace *nsPtr; - ItclObjectInfo * infoPtr = NULL; - ItclClass *iclsPtr = NULL; - ItclClass * classPtr; - FOREACH_HASH_DECLS; - int i; - - ItclShowArgs(0, "cObjFunc called", objc, objv); -fprintf(stderr, "objv: %d %p\n", objc, objv); -for(i = 0; i<objc;i++) { - fprintf(stderr, "arg:%d:%s:\n", i, Tcl_GetString(objv[i])); -} - nsPtr = Tcl_GetCurrentNamespace(interp); -fprintf(stderr, "IP:%p %p %p !%s!\n",interp, clientData, nsPtr, nsPtr->fullName); - infoPtr = (ClientData)Tcl_GetAssocData(interp, ITCL_INTERP_DATA, NULL); - FOREACH_HASH_VALUE(classPtr,&infoPtr->nameClasses) { - if (strcmp(Tcl_GetString(objv[1]), Tcl_GetString(classPtr->fullNamePtr)) == 0 || - strcmp(Tcl_GetString(objv[2]), Tcl_GetString(classPtr->fullNamePtr)) == 0) { - iclsPtr = classPtr; - break; - } - } -fprintf(stderr, "IP2:%p %p %p\n",interp, clientData, iclsPtr); - return TCL_OK; -} - - -void -RegisterDebugCFunctions(Tcl_Interp *interp) -{ - int result; - - /* args: interp, name, c-function, clientdata, deleteproc */ - result = Itcl_RegisterC(interp, "cArgFunc", cArgFunc, NULL, NULL); - result = Itcl_RegisterObjC(interp, "cObjFunc", cObjFunc, NULL, NULL); - if (result != 0) { - } -} -#endif diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclUtil.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclUtil.c deleted file mode 100644 index 057f01b..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclUtil.c +++ /dev/null @@ -1,1202 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * [incr Tcl] provides object-oriented extensions to Tcl, much as - * C++ provides object-oriented extensions to C. It provides a means - * of encapsulating related procedures together with their shared data - * in a local namespace that is hidden from the outside world. It - * promotes code re-use through inheritance. More than anything else, - * it encourages better organization of Tcl applications through the - * object-oriented paradigm, leading to code that is easier to - * understand and maintain. - * - * This segment provides common utility functions used throughout - * the other [incr Tcl] source files. - * - * ======================================================================== - * AUTHOR: Michael J. McLennan - * Bell Labs Innovations for Lucent Technologies - * mmclennan@lucent.com - * http://www.tcltk.com/itcl - * - * overhauled version author: Arnulf Wiedemann - * ======================================================================== - * Copyright (c) 1993-1998 Lucent Technologies, Inc. - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ -#include "itclInt.h" - -#ifdef ITCL_PRESERVE_DEBUG -#include <malloc.h> -#endif - -/* - * POOL OF LIST ELEMENTS FOR LINKED LIST - */ -static Itcl_ListElem *listPool = NULL; -static int listPoolLen = 0; - -#define ITCL_VALID_LIST 0x01face10 /* magic bit pattern for validation */ -#define ITCL_LIST_POOL_SIZE 200 /* max number of elements in listPool */ - -/* - * This structure is used to take a snapshot of the interpreter - * state in Itcl_SaveInterpState. You can snapshot the state, - * execute a command, and then back up to the result or the - * error that was previously in progress. - */ -typedef struct InterpState { - int validate; /* validation stamp */ - int status; /* return code status */ - Tcl_Obj *objResult; /* result object */ - char *errorInfo; /* contents of errorInfo variable */ - char *errorCode; /* contents of errorCode variable */ -} InterpState; - -#define TCL_STATE_VALID 0x01233210 /* magic bit pattern for validation */ - -#ifdef ITCL_PRESERVE_DEBUG -static Tcl_HashTable itclPreserveInfos; -static int itclPreserveInfoInitted = 0; -#endif - - -/* - * ------------------------------------------------------------------------ - * Itcl_Assert() - * - * Called whenever an assert() test fails. Prints a diagnostic - * message and abruptly exits. - * ------------------------------------------------------------------------ - */ - -void -Itcl_Assert(testExpr, fileName, lineNumber) - const char *testExpr; /* string representing test expression */ - const char *fileName; /* file name containing this call */ - int lineNumber; /* line number containing this call */ -{ - Tcl_Panic("Itcl Assertion failed: \"%s\" (line %d of %s)", - testExpr, lineNumber, fileName); -} - - - -/* - * ------------------------------------------------------------------------ - * Itcl_InitStack() - * - * Initializes a stack structure, allocating a certain amount of memory - * for the stack and setting the stack length to zero. - * ------------------------------------------------------------------------ - */ -void -Itcl_InitStack(stack) - Itcl_Stack *stack; /* stack to be initialized */ -{ - stack->values = stack->space; - stack->max = sizeof(stack->space)/sizeof(ClientData); - stack->len = 0; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteStack() - * - * Destroys a stack structure, freeing any memory that may have been - * allocated to represent it. - * ------------------------------------------------------------------------ - */ -void -Itcl_DeleteStack(stack) - Itcl_Stack *stack; /* stack to be deleted */ -{ - /* - * If memory was explicitly allocated (instead of using the - * built-in buffer) then free it. - */ - if (stack->values != stack->space) { - ckfree((char*)stack->values); - } - stack->values = NULL; - stack->len = stack->max = 0; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_PushStack() - * - * Pushes a piece of client data onto the top of the given stack. - * If the stack is not large enough, it is automatically resized. - * ------------------------------------------------------------------------ - */ -void -Itcl_PushStack(cdata,stack) - ClientData cdata; /* data to be pushed onto stack */ - Itcl_Stack *stack; /* stack */ -{ - ClientData *newStack; - - if (stack->len+1 >= stack->max) { - stack->max = 2*stack->max; - newStack = (ClientData*) - ckalloc((unsigned)(stack->max*sizeof(ClientData))); - - if (stack->values) { - memcpy((char*)newStack, (char*)stack->values, - (size_t)(stack->len*sizeof(ClientData))); - - if (stack->values != stack->space) - ckfree((char*)stack->values); - } - stack->values = newStack; - } - stack->values[stack->len++] = cdata; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_PopStack() - * - * Pops a bit of client data from the top of the given stack. - * ------------------------------------------------------------------------ - */ -ClientData -Itcl_PopStack(stack) - Itcl_Stack *stack; /* stack to be manipulated */ -{ - if (stack->values && (stack->len > 0)) { - stack->len--; - return stack->values[stack->len]; - } - return (ClientData)NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_PeekStack() - * - * Gets the current value from the top of the given stack. - * ------------------------------------------------------------------------ - */ -ClientData -Itcl_PeekStack(stack) - Itcl_Stack *stack; /* stack to be examined */ -{ - if (stack->values && (stack->len > 0)) { - return stack->values[stack->len-1]; - } - return (ClientData)NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_GetStackValue() - * - * Gets a value at some index within the stack. Index "0" is the - * first value pushed onto the stack. - * ------------------------------------------------------------------------ - */ -ClientData -Itcl_GetStackValue(stack,pos) - Itcl_Stack *stack; /* stack to be examined */ - int pos; /* get value at this index */ -{ - if (stack->values && (stack->len > 0)) { - assert(pos < stack->len); - return stack->values[pos]; - } - return (ClientData)NULL; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_InitList() - * - * Initializes a linked list structure, setting the list to the empty - * state. - * ------------------------------------------------------------------------ - */ -void -Itcl_InitList(listPtr) - Itcl_List *listPtr; /* list to be initialized */ -{ - listPtr->validate = ITCL_VALID_LIST; - listPtr->num = 0; - listPtr->head = NULL; - listPtr->tail = NULL; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteList() - * - * Destroys a linked list structure, deleting all of its elements and - * setting it to an empty state. If the elements have memory associated - * with them, this memory must be freed before deleting the list or it - * will be lost. - * ------------------------------------------------------------------------ - */ -void -Itcl_DeleteList(listPtr) - Itcl_List *listPtr; /* list to be deleted */ -{ - Itcl_ListElem *elemPtr; - - assert(listPtr->validate == ITCL_VALID_LIST); - - elemPtr = listPtr->head; - while (elemPtr) { - elemPtr = Itcl_DeleteListElem(elemPtr); - } - listPtr->validate = 0; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CreateListElem() - * - * Low-level routined used by procedures like Itcl_InsertList() and - * Itcl_AppendList() to create new list elements. If elements are - * available, one is taken from the list element pool. Otherwise, - * a new one is allocated. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_CreateListElem( - Itcl_List *listPtr) /* list that will contain this new element */ -{ - Itcl_ListElem *elemPtr; - - if (listPoolLen > 0) { - elemPtr = listPool; - listPool = elemPtr->next; - --listPoolLen; - } else { - elemPtr = (Itcl_ListElem*)ckalloc((unsigned)sizeof(Itcl_ListElem)); - } - elemPtr->owner = listPtr; - elemPtr->value = NULL; - elemPtr->next = NULL; - elemPtr->prev = NULL; - - return elemPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_DeleteListElem() - * - * Destroys a single element in a linked list, returning it to a pool of - * elements that can be later reused. Returns a pointer to the next - * element in the list. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_DeleteListElem(elemPtr) - Itcl_ListElem *elemPtr; /* list element to be deleted */ -{ - Itcl_List *listPtr; - Itcl_ListElem *nextPtr; - - nextPtr = elemPtr->next; - - if (elemPtr->prev) { - elemPtr->prev->next = elemPtr->next; - } - if (elemPtr->next) { - elemPtr->next->prev = elemPtr->prev; - } - - listPtr = elemPtr->owner; - if (elemPtr == listPtr->head) { - listPtr->head = elemPtr->next; - } - if (elemPtr == listPtr->tail) { - listPtr->tail = elemPtr->prev; - } - --listPtr->num; - - if (listPoolLen < ITCL_LIST_POOL_SIZE) { - elemPtr->next = listPool; - listPool = elemPtr; - ++listPoolLen; - } else { - ckfree((char*)elemPtr); - } - return nextPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_InsertList() - * - * Creates a new list element containing the given value and returns - * a pointer to it. The element is inserted at the beginning of the - * specified list. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_InsertList(listPtr,val) - Itcl_List *listPtr; /* list being modified */ - ClientData val; /* value associated with new element */ -{ - Itcl_ListElem *elemPtr; - assert(listPtr->validate == ITCL_VALID_LIST); - - elemPtr = Itcl_CreateListElem(listPtr); - - elemPtr->value = val; - elemPtr->next = listPtr->head; - elemPtr->prev = NULL; - if (listPtr->head) { - listPtr->head->prev = elemPtr; - } - listPtr->head = elemPtr; - if (listPtr->tail == NULL) { - listPtr->tail = elemPtr; - } - ++listPtr->num; - - return elemPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_InsertListElem() - * - * Creates a new list element containing the given value and returns - * a pointer to it. The element is inserted in the list just before - * the specified element. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_InsertListElem(pos,val) - Itcl_ListElem *pos; /* insert just before this element */ - ClientData val; /* value associated with new element */ -{ - Itcl_List *listPtr; - Itcl_ListElem *elemPtr; - - listPtr = pos->owner; - assert(listPtr->validate == ITCL_VALID_LIST); - assert(pos != NULL); - - elemPtr = Itcl_CreateListElem(listPtr); - elemPtr->value = val; - - elemPtr->prev = pos->prev; - if (elemPtr->prev) { - elemPtr->prev->next = elemPtr; - } - elemPtr->next = pos; - pos->prev = elemPtr; - - if (listPtr->head == pos) { - listPtr->head = elemPtr; - } - if (listPtr->tail == NULL) { - listPtr->tail = elemPtr; - } - ++listPtr->num; - - return elemPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AppendList() - * - * Creates a new list element containing the given value and returns - * a pointer to it. The element is appended at the end of the - * specified list. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_AppendList(listPtr,val) - Itcl_List *listPtr; /* list being modified */ - ClientData val; /* value associated with new element */ -{ - Itcl_ListElem *elemPtr; - assert(listPtr->validate == ITCL_VALID_LIST); - - elemPtr = Itcl_CreateListElem(listPtr); - - elemPtr->value = val; - elemPtr->prev = listPtr->tail; - elemPtr->next = NULL; - if (listPtr->tail) { - listPtr->tail->next = elemPtr; - } - listPtr->tail = elemPtr; - if (listPtr->head == NULL) { - listPtr->head = elemPtr; - } - ++listPtr->num; - - return elemPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_AppendListElem() - * - * Creates a new list element containing the given value and returns - * a pointer to it. The element is inserted in the list just after - * the specified element. - * ------------------------------------------------------------------------ - */ -Itcl_ListElem* -Itcl_AppendListElem(pos,val) - Itcl_ListElem *pos; /* insert just after this element */ - ClientData val; /* value associated with new element */ -{ - Itcl_List *listPtr; - Itcl_ListElem *elemPtr; - - listPtr = pos->owner; - assert(listPtr->validate == ITCL_VALID_LIST); - assert(pos != NULL); - - elemPtr = Itcl_CreateListElem(listPtr); - elemPtr->value = val; - - elemPtr->next = pos->next; - if (elemPtr->next) { - elemPtr->next->prev = elemPtr; - } - elemPtr->prev = pos; - pos->next = elemPtr; - - if (listPtr->tail == pos) { - listPtr->tail = elemPtr; - } - if (listPtr->head == NULL) { - listPtr->head = elemPtr; - } - ++listPtr->num; - - return elemPtr; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_SetListValue() - * - * Modifies the value associated with a list element. - * ------------------------------------------------------------------------ - */ -void -Itcl_SetListValue(elemPtr,val) - Itcl_ListElem *elemPtr; /* list element being modified */ - ClientData val; /* new value associated with element */ -{ - Itcl_List *listPtr = elemPtr->owner; - assert(listPtr->validate == ITCL_VALID_LIST); - assert(elemPtr != NULL); - - elemPtr->value = val; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_FinishList() - * - * free all memory used in the list pool - * ------------------------------------------------------------------------ - */ -void -Itcl_FinishList() -{ - Itcl_ListElem *listPtr; - Itcl_ListElem *elemPtr; - - listPtr = listPool; - while (listPtr != NULL) { - elemPtr = listPtr; - listPtr = elemPtr->next; - ckfree((char *)elemPtr); - elemPtr = NULL; - } - listPool = NULL; - listPoolLen = 0; -} - - -/* - * ======================================================================== - * REFERENCE-COUNTED DATA - * - * The following procedures manage generic reference-counted data. - * They are similar in spirit to the Tcl_Preserve/Tcl_Release - * procedures defined in the Tcl/Tk core. But these procedures use - * a hash table instead of a linked list to maintain the references, - * so they scale better. Also, the Tcl procedures have a bad behavior - * during the "exit" command. Their exit handler shuts them down - * when other data is still being reference-counted and cleaned up. - * - * ------------------------------------------------------------------------ - * Itcl_EventuallyFree() - * - * Registers a piece of data so that it will be freed when no longer - * in use. The data is registered with an initial usage count of "0". - * Future calls to Itcl_PreserveData() increase this usage count, and - * calls to Itcl_ReleaseData() decrease the count until it reaches - * zero and the data is freed. - * ------------------------------------------------------------------------ - */ -void -Itcl_EventuallyFree( - ClientData cdata, /* data to be freed when not in use */ - Tcl_FreeProc *fproc) /* procedure called to free data */ -{ - /* - * If the clientData value is NULL, do nothing. - */ - if (cdata == NULL) { - return; - } - Tcl_EventuallyFree(cdata, fproc); - return; - -} -#ifdef ITCL_PRESERVE_DEBUG -void -Itcl_DbDumpPreserveInfo( - const char *fileName) -{ - FOREACH_HASH_DECLS; - FILE *fd; - ItclPreserveInfo *ipiPtr; - ItclPreserveInfoEntry *ipiePtr; - size_t j; - - if (fileName == NULL) { - fd = stderr; - } else { - fd = fopen(fileName, "w"); - } - fprintf(fd, "type\taddr\tfile\tline\n"); - FOREACH_HASH_VALUE(ipiPtr, &itclPreserveInfos) { - if (ipiPtr->refCount == 0) { - continue; - } - fprintf(stderr, "DAT!%p!%" TCL_LL_MODIFIER "u!\n", ipiPtr->clientData, (Tcl_WideUInt) ipiPtr->refCount); - for (j = 0; j < ipiPtr->numEntries; j++) { - ipiePtr = &ipiPtr->entries[j]; - if (ipiePtr->type != ITCL_PRESERVE_DELETED) { - fprintf(fd, "%s\t%p\t%s\t%d\n", - ipiePtr->type == ITCL_PRESERVE_INCR ? "INCR" : "DECR", - ipiPtr->clientData, ipiePtr->fileName, ipiePtr->line); - } - } - } - if (fd != stderr) { - fclose(fd); - } -} -#endif - -/* - * ------------------------------------------------------------------------ - * Itcl_PreserveData() - * - * Increases the usage count for a piece of data that will be freed - * later when no longer needed. Each call to Itcl_PreserveData() - * puts one claim on a piece of data, and subsequent calls to - * Itcl_ReleaseData() remove those claims. When Itcl_EventuallyFree() - * is called, and when the usage count reaches zero, the data is - * freed. - * ------------------------------------------------------------------------ - */ -#ifdef ITCL_PRESERVE_DEBUG -void -ItclDbgPreserveData( - ClientData cdata, /* data to be preserved */ - int line, - const char *file) -{ - - /* - * If the clientData value is NULL, do nothing. - */ - if (cdata == NULL) { - return; - } - { - Tcl_HashEntry *hPtr; - ItclPreserveInfo *ipiPtr; - ItclPreserveInfoEntry *ipiePtr; - int isNew; - - if (!itclPreserveInfoInitted) { - Tcl_InitHashTable(&itclPreserveInfos, TCL_ONE_WORD_KEYS); - itclPreserveInfoInitted = 1; - } - hPtr = Tcl_CreateHashEntry(&itclPreserveInfos, cdata, &isNew); - if (isNew) { - ipiPtr = (ItclPreserveInfo *)ckalloc(sizeof(ItclPreserveInfo)); - ipiPtr->refCount = 0; - ipiPtr->size = ITCL_PRESERVE_BUCKET_SIZE; - ipiPtr->numEntries = 0; - ipiPtr->clientData = cdata; - ipiPtr->entries = (ItclPreserveInfoEntry *)malloc( - sizeof(ItclPreserveInfoEntry) * ipiPtr->size); - Tcl_SetHashValue(hPtr, ipiPtr); - } - ipiPtr = Tcl_GetHashValue(hPtr); - if (ipiPtr->numEntries >= ipiPtr->size) { - ipiPtr->size += ITCL_PRESERVE_BUCKET_SIZE; - ipiPtr->entries = (ItclPreserveInfoEntry *) - realloc((char *)ipiPtr->entries, - sizeof(ItclPreserveInfoEntry) * - ipiPtr->size); - } - ipiePtr = &ipiPtr->entries[ipiPtr->numEntries++]; - ipiePtr->type = ITCL_PRESERVE_INCR; - ipiePtr->line = line; - ipiePtr->fileName = file; - ipiPtr->refCount++; - } - - Tcl_Preserve(cdata); - return; -} -# else -void -Itcl_PreserveData( - ClientData cdata) /* data to be preserved */ -{ - - /* - * If the clientData value is NULL, do nothing. - */ - if (cdata == NULL) { - return; - } - Tcl_Preserve(cdata); - return; -} -#endif - -/* - * ------------------------------------------------------------------------ - * Itcl_ReleaseData() - * - * Decreases the usage count for a piece of data that was registered - * previously via Itcl_PreserveData(). After Itcl_EventuallyFree() - * is called and the usage count reaches zero, the data is - * automatically freed. - * ------------------------------------------------------------------------ - */ -#ifdef ITCL_PRESERVE_DEBUG -void -ItclDbgReleaseData( - ClientData cdata, /* data to be released */ - int line, - const char *file) -{ - - int noDelete = 0; - - /* - * If the clientData value is NULL, do nothing. - */ - if (cdata == NULL) { - return; - } - { - Tcl_HashEntry *hPtr; - ItclPreserveInfo *ipiPtr; - ItclPreserveInfoEntry *ipiePtr; - - if (!itclPreserveInfoInitted) { - Tcl_InitHashTable(&itclPreserveInfos, TCL_ONE_WORD_KEYS); - itclPreserveInfoInitted = 1; - } - hPtr = Tcl_FindHashEntry(&itclPreserveInfos, cdata); - if (hPtr != NULL) { - ipiPtr = Tcl_GetHashValue(hPtr); - if (ipiPtr->numEntries >= ipiPtr->size) { - ipiPtr->size += ITCL_PRESERVE_BUCKET_SIZE; - ipiPtr->entries = (ItclPreserveInfoEntry *) - realloc((char *)ipiPtr->entries, - sizeof(ItclPreserveInfoEntry) * - ipiPtr->size); - } - ipiePtr = &ipiPtr->entries[ipiPtr->numEntries++]; - ipiePtr->type = ITCL_PRESERVE_DECR; - ipiePtr->line = line; - ipiePtr->fileName = file; - if (ipiPtr->refCount-- == 0) { - fprintf(stderr, "REFCOUNT < 0 for: %p!\n", cdata); - noDelete = 1; - } - } - } - if (!noDelete) { - Tcl_Release(cdata); - } - return; -} -#else -void -Itcl_ReleaseData( - ClientData cdata) /* data to be released */ -{ - - /* - * If the clientData value is NULL, do nothing. - */ - if (cdata == NULL) { - return; - } - Tcl_Release(cdata); - return; -} -#endif - -/* - * ------------------------------------------------------------------------ - * Itcl_SaveInterpState() - * - * Takes a snapshot of the current result state of the interpreter. - * The snapshot can be restored at any point by Itcl_RestoreInterpState. - * So if you are in the middle of building a return result, you can - * snapshot the interpreter, execute a command that might generate an - * error, restore the snapshot, and continue building the result string. - * - * Once a snapshot is saved, it must be restored by calling - * Itcl_RestoreInterpState, or discarded by calling - * Itcl_DiscardInterpState. Otherwise, memory will be leaked. - * - * Returns a token representing the state of the interpreter. - * ------------------------------------------------------------------------ - */ -Itcl_InterpState -Itcl_SaveInterpState(interp, status) - Tcl_Interp* interp; /* interpreter being modified */ - int status; /* integer status code for current operation */ -{ - return (Itcl_InterpState) Tcl_SaveInterpState(interp, status); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_RestoreInterpState() - * - * Restores the state of the interpreter to a snapshot taken by - * Itcl_SaveInterpState. This affects variables such as "errorInfo" - * and "errorCode". After this call, the token for the interpreter - * state is no longer valid. - * - * Returns the status code that was pending at the time the state was - * captured. - * ------------------------------------------------------------------------ - */ -int -Itcl_RestoreInterpState(interp, state) - Tcl_Interp* interp; /* interpreter being modified */ - Itcl_InterpState state; /* token representing interpreter state */ -{ - return Tcl_RestoreInterpState(interp, (Tcl_InterpState)state); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_DiscardInterpState() - * - * Frees the memory associated with an interpreter snapshot taken by - * Itcl_SaveInterpState. If the snapshot is not restored, this - * procedure must be called to discard it, or the memory will be lost. - * After this call, the token for the interpreter state is no longer - * valid. - * ------------------------------------------------------------------------ - */ -void -Itcl_DiscardInterpState(state) - Itcl_InterpState state; /* token representing interpreter state */ -{ - Tcl_DiscardInterpState((Tcl_InterpState)state); - return; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_Protection() - * - * Used to query/set the protection level used when commands/variables - * are defined within a class. The default protection level (when - * no public/protected/private command is active) is ITCL_DEFAULT_PROTECT. - * In the default case, new commands are treated as public, while new - * variables are treated as protected. - * - * If the specified level is 0, then this procedure returns the - * current value without changing it. Otherwise, it sets the current - * value to the specified protection level, and returns the previous - * value. - * ------------------------------------------------------------------------ - */ -int -Itcl_Protection(interp, newLevel) - Tcl_Interp *interp; /* interpreter being queried */ - int newLevel; /* new protection level or 0 */ -{ - int oldVal; - ItclObjectInfo *infoPtr; - - /* - * If a new level was specified, then set the protection level. - * In any case, return the protection level as it stands right now. - */ - infoPtr = (ItclObjectInfo*) Tcl_GetAssocData(interp, ITCL_INTERP_DATA, - (Tcl_InterpDeleteProc**)NULL); - - assert(infoPtr != NULL); - oldVal = infoPtr->protection; - - if (newLevel != 0) { - assert(newLevel == ITCL_PUBLIC || - newLevel == ITCL_PROTECTED || - newLevel == ITCL_PRIVATE || - newLevel == ITCL_DEFAULT_PROTECT); - infoPtr->protection = newLevel; - } - return oldVal; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_ParseNamespPath() - * - * Parses a reference to a namespace element of the form: - * - * namesp::namesp::namesp::element - * - * Returns pointers to the head part ("namesp::namesp::namesp") - * and the tail part ("element"). If the head part is missing, - * a NULL pointer is returned and the rest of the string is taken - * as the tail. - * - * Both head and tail point to locations within the given dynamic - * string buffer. This buffer must be uninitialized when passed - * into this procedure, and it must be freed later on, when the - * strings are no longer needed. - * ------------------------------------------------------------------------ - */ -void -Itcl_ParseNamespPath( - const char *name, /* path name to class member */ - Tcl_DString *buffer, /* dynamic string buffer (uninitialized) */ - const char **head, /* returns "namesp::namesp::namesp" part */ - const char **tail) /* returns "element" part */ -{ - register char *sep, *newname; - - Tcl_DStringInit(buffer); - - /* - * Copy the name into the buffer and parse it. Look - * backward from the end of the string to the first '::' - * scope qualifier. - */ - Tcl_DStringAppend(buffer, name, -1); - newname = Tcl_DStringValue(buffer); - - for (sep=newname; *sep != '\0'; sep++) - ; - - while (--sep > newname) { - if (*sep == ':' && *(sep-1) == ':') { - break; - } - } - - /* - * Found head/tail parts. If there are extra :'s, keep backing - * up until the head is found. This supports the Tcl namespace - * behavior, which allows names like "foo:::bar". - */ - if (sep > newname) { - *tail = sep+1; - while (sep > newname && *(sep-1) == ':') { - sep--; - } - *sep = '\0'; - *head = newname; - } else { - - /* - * No :: separators--the whole name is treated as a tail. - */ - *tail = newname; - *head = NULL; - } -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CanAccess2() - * - * Checks to see if a class member can be accessed from a particular - * namespace context. Public things can always be accessed. Protected - * things can be accessed if the "from" namespace appears in the - * inheritance hierarchy of the class namespace. Private things - * can be accessed only if the "from" namespace is the same as the - * class that contains them. - * - * Returns 1/0 indicating true/false. - * ------------------------------------------------------------------------ - */ -int -Itcl_CanAccess2( - ItclClass *iclsPtr, /* class being tested */ - int protection, /* protection level being tested */ - Tcl_Namespace* fromNsPtr) /* namespace requesting access */ -{ - ItclClass* fromIclsPtr; - Tcl_HashEntry *entry; - - /* - * If the protection level is "public" or "private", then the - * answer is known immediately. - */ - if (protection == ITCL_PUBLIC) { - return 1; - } else { - if (protection == ITCL_PRIVATE) { - entry = Tcl_FindHashEntry(&iclsPtr->infoPtr->namespaceClasses, - fromNsPtr); - if (entry == NULL) { - return 0; - } - return (iclsPtr == Tcl_GetHashValue(entry)); - } - } - - /* - * If the protection level is "protected", then check the - * heritage of the namespace requesting access. If cdefnPtr - * is in the heritage, then access is allowed. - */ - assert (protection == ITCL_PROTECTED); - - if (Itcl_IsClassNamespace(fromNsPtr)) { - entry = Tcl_FindHashEntry(&iclsPtr->infoPtr->namespaceClasses, - fromNsPtr); - if (entry == NULL) { - return 0; - } - fromIclsPtr = Tcl_GetHashValue(entry); - - entry = Tcl_FindHashEntry(&fromIclsPtr->heritage, - (char*)iclsPtr); - - if (entry) { - return 1; - } - } - return 0; -} - -/* - * ------------------------------------------------------------------------ - * Itcl_CanAccess() - * - * Checks to see if a class member can be accessed from a particular - * namespace context. Public things can always be accessed. Protected - * things can be accessed if the "from" namespace appears in the - * inheritance hierarchy of the class namespace. Private things - * can be accessed only if the "from" namespace is the same as the - * class that contains them. - * - * Returns 1/0 indicating true/false. - * ------------------------------------------------------------------------ - */ -int -Itcl_CanAccess( - ItclMemberFunc* imPtr, /* class member being tested */ - Tcl_Namespace* fromNsPtr) /* namespace requesting access */ -{ - return Itcl_CanAccess2(imPtr->iclsPtr, imPtr->protection, fromNsPtr); -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_CanAccessFunc() - * - * Checks to see if a member function with the specified protection - * level can be accessed from a particular namespace context. This - * follows the same rules enforced by Itcl_CanAccess, but adds one - * special case: If the function is a protected method, and if the - * current context is a base class that has the same method, then - * access is allowed. - * - * Returns 1/0 indicating true/false. - * ------------------------------------------------------------------------ - */ -int -Itcl_CanAccessFunc( - ItclMemberFunc* imPtr, /* member function being tested */ - Tcl_Namespace* fromNsPtr) /* namespace requesting access */ -{ - ItclClass *iclsPtr; - ItclClass *fromIclsPtr; - ItclMemberFunc *ovlfunc; - Tcl_HashEntry *entry; - - /* - * Apply the usual rules first. - */ - if (Itcl_CanAccess(imPtr, fromNsPtr)) { - return 1; - } - - /* - * As a last resort, see if the namespace is really a base - * class of the class containing the method. Look for a - * method with the same name in the base class. If there - * is one, then this method overrides it, and the base class - * has access. - */ - if ((imPtr->flags & ITCL_COMMON) == 0 && - Itcl_IsClassNamespace(fromNsPtr)) { - Tcl_HashEntry *hPtr; - - iclsPtr = imPtr->iclsPtr; - hPtr = Tcl_FindHashEntry(&iclsPtr->infoPtr->namespaceClasses, - (char *)fromNsPtr); - if (hPtr == NULL) { - return 0; - } - fromIclsPtr = Tcl_GetHashValue(hPtr); - - if (Tcl_FindHashEntry(&iclsPtr->heritage, (char*)fromIclsPtr)) { - entry = Tcl_FindHashEntry(&fromIclsPtr->resolveCmds, - (char *)imPtr->namePtr); - - if (entry) { - ItclCmdLookup *clookup; - clookup = (ItclCmdLookup *)Tcl_GetHashValue(entry); - ovlfunc = clookup->imPtr; - if ((ovlfunc->flags & ITCL_COMMON) == 0 && - ovlfunc->protection < ITCL_PRIVATE) { - return 1; - } - } - } - } - return 0; -} - - -/* - * ------------------------------------------------------------------------ - * Itcl_DecodeScopedCommand() - * - * Decodes a scoped command of the form: - * - * namespace inscope <namesp> <command> - * - * If the given string is not a scoped value, this procedure does - * nothing and returns TCL_OK. If the string is a scoped value, - * then it is decoded, and the namespace, and the simple command - * string are returned as arguments; the simple command should - * be freed when no longer in use. If anything goes wrong, this - * procedure returns TCL_ERROR, along with an error message in - * the interpreter. - * ------------------------------------------------------------------------ - */ -int -Itcl_DecodeScopedCommand( - Tcl_Interp *interp, /* current interpreter */ - const char *name, /* string to be decoded */ - Tcl_Namespace **rNsPtr, /* returns: namespace for scoped value */ - char **rCmdPtr) /* returns: simple command word */ -{ - Tcl_Namespace *nsPtr; - char *cmdName; - const char *pos; - const char **listv; - int listc; - int result; - int len; - - nsPtr = NULL; - len = strlen(name); - cmdName = ckalloc((unsigned)strlen(name)+1); - strcpy(cmdName, name); - - if ((*name == 'n') && (len > 17) && (strncmp(name, "namespace", 9) == 0)) { - for (pos = (name + 9); (*pos == ' '); pos++) { - /* empty body: skip over spaces */ - } - if ((*pos == 'i') && ((pos + 7) <= (name + len)) - && (strncmp(pos, "inscope", 7) == 0)) { - - result = Tcl_SplitList(interp, (const char *)name, &listc, - &listv); - if (result == TCL_OK) { - if (listc != 4) { - Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), - "malformed command \"", name, "\": should be \"", - "namespace inscope namesp command\"", - (char*)NULL); - result = TCL_ERROR; - } else { - nsPtr = Tcl_FindNamespace(interp, listv[2], - (Tcl_Namespace*)NULL, TCL_LEAVE_ERR_MSG); - - if (nsPtr == NULL) { - result = TCL_ERROR; - } else { - ckfree(cmdName); - cmdName = ckalloc((unsigned)(strlen(listv[3])+1)); - strcpy(cmdName, listv[3]); - } - } - } - ckfree((char*)listv); - - if (result != TCL_OK) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (while decoding scoped command \"%s\")", - name)); - ckfree(cmdName); - return TCL_ERROR; - } - } - } - - *rNsPtr = nsPtr; - *rCmdPtr = cmdName; - return TCL_OK; -} - -#ifdef ITCL_PRESERVE_DEBUG -#undef Itcl_PreserveData -#undef Itcl_ReleaseData - -void -Itcl_PreserveData( - ClientData cdata) -{ - ItclDbgPreserveData(cdata, 0, ""); -} - -void -Itcl_ReleaseData( - ClientData cdata) -{ - ItclDbgReleaseData(cdata, 0, ""); -} -#endif diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclVCInt.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclVCInt.h deleted file mode 100644 index 93ba54f..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclVCInt.h +++ /dev/null @@ -1,37 +0,0 @@ -#define ITCL_RESOLVE_DATA "ITCL_Resolve_Info" - -typedef struct ItclResolvngInfo { - Tcl_Interp *interp; - Tcl_HashTable resolveVars; /* all possible names for variables in - * this class (e.g., x, foo::x, etc.) */ - Tcl_HashTable resolveCmds; /* all possible names for functions in - * this class (e.g., x, foo::x, etc.) */ - ItclCheckClassProtection *varProtFcn; - ItclCheckClassProtection *cmdProtFcn; - Tcl_HashTable objectVarsTables; - Tcl_HashTable objectCmdsTables; -} ItclResolvingInfo; - -typedef struct ObjectVarInfo { - ClientData clientData; - ItclObject *ioPtr; - Tcl_Var varPtr; -} ObjectVarInfo; - -typedef struct ObjectVarTableInfo { - Tcl_HashTable varInfos; - TclVarHashTable *tablePtr; -} ObjectVarTableInfo; - -typedef struct ObjectCmdInfo { - ClientData clientData; - ItclObject *ioPtr; - Tcl_Command cmdPtr; -} ObjectCmdInfo; - -typedef struct ObjectCmdTableInfo { - Tcl_HashTable cmdInfos; - Tcl_HashTable *tablePtr; -} ObjectCmdTableInfo; - - diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.c b/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.c deleted file mode 100644 index 0511d14..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * These procedures handle command and variable resolution - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * - * ======================================================================== - * Copyright (c) Arnulf Wiedemann - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include <tclInt.h> -#include "itclInt.h" -#include "itclVCInt.h" - -#ifdef NEW_PROTO_RESOLVER -static void -ItclDeleteResolveInfo( - ClientData clientData, - Tcl_Interp *interp) -{ - ckfree((char *)clientData); -} -#endif - -int -ItclVarsAndCommandResolveInit( - Tcl_Interp *interp) -{ -#ifdef NEW_PROTO_RESOLVER - ItclResolvingInfo *iriPtr; - - /* - * Create the top-level data structure for tracking objects. - * Store this as "associated data" for easy access, but link - * it to the itcl namespace for ownership. - */ - iriPtr = (ItclResolvingInfo*)ckalloc(sizeof(ItclResolvingInfo)); - memset(iriPtr, 0, sizeof(ItclResolvingInfo)); - iriPtr->interp = interp; - Tcl_InitHashTable(&iriPtr->resolveVars, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&iriPtr->resolveCmds, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&iriPtr->objectVarsTables, TCL_ONE_WORD_KEYS); - Tcl_InitHashTable(&iriPtr->objectCmdsTables, TCL_ONE_WORD_KEYS); - - Tcl_SetAssocData(interp, ITCL_RESOLVE_DATA, - (Tcl_InterpDeleteProc*)ItclDeleteResolveInfo, (ClientData)iriPtr); - Tcl_Preserve((ClientData)iriPtr); - - Itcl_SetClassCommandProtectionCallback(interp, NULL, - Itcl_CheckClassCommandProtection); - Itcl_SetClassVariableProtectionCallback(interp, NULL, - Itcl_CheckClassVariableProtection); -#endif - return TCL_OK; -} - -ClientData -Itcl_RegisterClassVariable( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *varName, - ClientData clientData) -{ - Tcl_HashTable *tablePtr; - Tcl_HashEntry *hPtr; - ItclResolvingInfo *iriPtr; - int isNew; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_CreateHashEntry(&iriPtr->resolveVars, nsPtr->fullName, &isNew); - if (isNew) { - tablePtr = (Tcl_HashTable *)ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitHashTable(tablePtr, TCL_STRING_KEYS); - Tcl_SetHashValue(hPtr, tablePtr); - - } else { - tablePtr = Tcl_GetHashValue(hPtr); - } - hPtr = Tcl_CreateHashEntry(tablePtr, varName, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr, clientData); - } - return Tcl_GetHashValue(hPtr); -} - -ClientData -Itcl_RegisterClassCommand( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - const char *cmdName, - ClientData clientData) -{ - Tcl_HashEntry *hPtr; - Tcl_HashTable *tablePtr; - ItclResolvingInfo *iriPtr; - int isNew; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_CreateHashEntry(&iriPtr->resolveCmds, nsPtr->fullName, &isNew); - if (isNew) { - tablePtr = (Tcl_HashTable *)ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitHashTable(tablePtr, TCL_STRING_KEYS); - Tcl_SetHashValue(hPtr, tablePtr); - - } else { - tablePtr = Tcl_GetHashValue(hPtr); - } - hPtr = Tcl_CreateHashEntry(tablePtr, cmdName, &isNew); - if (isNew) { - Tcl_SetHashValue(hPtr, clientData); - } - return Tcl_GetHashValue(hPtr); -} - -Tcl_Var -Itcl_RegisterObjectVariable( - Tcl_Interp *interp, - ItclObject *ioPtr, - const char *varName, - ClientData clientData, - Tcl_Var varPtr, - Tcl_Namespace *nsPtr) -{ - Tcl_HashEntry *hPtr; - ItclResolvingInfo *iriPtr; - ObjectVarTableInfo *ovtiPtr; - ObjectVarInfo *oviPtr; - int isNew; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_CreateHashEntry(&iriPtr->objectVarsTables, - (char *)ioPtr, &isNew); - if (isNew) { - ovtiPtr = (ObjectVarTableInfo *)ckalloc(sizeof(ObjectVarTableInfo)); - Tcl_InitHashTable(&ovtiPtr->varInfos, TCL_ONE_WORD_KEYS); - ovtiPtr->tablePtr = &((Namespace *)nsPtr)->varTable; - Tcl_SetHashValue(hPtr, ovtiPtr); - } else { - ovtiPtr = Tcl_GetHashValue(hPtr); - } - hPtr = Tcl_CreateHashEntry(&ovtiPtr->varInfos, (char *)clientData, &isNew); - if (isNew) { - oviPtr = (ObjectVarInfo *)ckalloc(sizeof(ObjectVarInfo)); - memset(oviPtr, 0, sizeof(ObjectVarInfo)); - Tcl_SetHashValue(hPtr, oviPtr); - } else { - oviPtr = Tcl_GetHashValue(hPtr); - } - oviPtr->clientData = clientData; - oviPtr->ioPtr = ioPtr; - if (varPtr == NULL) { - varPtr = Tcl_NewNamespaceVar(interp, nsPtr, varName); - } - oviPtr->varPtr = varPtr; - return varPtr; -} - -Tcl_Command -Itcl_RegisterObjectCommand( - Tcl_Interp *interp, - ItclObject *ioPtr, - const char *cmdName, - ClientData clientData, - Tcl_Command cmdPtr, - Tcl_Namespace *nsPtr) -{ - Tcl_HashEntry *hPtr; - ItclResolvingInfo *iriPtr; - ObjectCmdTableInfo *octiPtr; - ObjectCmdInfo *ociPtr; - int isNew; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - hPtr = Tcl_CreateHashEntry(&iriPtr->objectCmdsTables, - (char *)ioPtr, &isNew); - if (isNew) { - octiPtr = (ObjectCmdTableInfo *)ckalloc(sizeof(ObjectCmdTableInfo)); - Tcl_InitHashTable(&octiPtr->cmdInfos, TCL_ONE_WORD_KEYS); - octiPtr->tablePtr = &((Namespace *)nsPtr)->cmdTable; - Tcl_SetHashValue(hPtr, octiPtr); - } else { - octiPtr = Tcl_GetHashValue(hPtr); - } - hPtr = Tcl_CreateHashEntry(&octiPtr->cmdInfos, (char *)clientData, &isNew); - if (isNew) { - ociPtr = (ObjectCmdInfo *)ckalloc(sizeof(ObjectCmdInfo)); - memset(ociPtr, 0, sizeof(ObjectCmdInfo)); - Tcl_SetHashValue(hPtr, ociPtr); - } else { - ociPtr = Tcl_GetHashValue(hPtr); - } - ociPtr->clientData = clientData; - ociPtr->ioPtr = ioPtr; - if (cmdPtr == NULL) { -/* - cmdPtr = Tcl_NewNamespaceVar(interp, nsPtr, varName); -*/ - } - ociPtr->cmdPtr = cmdPtr; - return cmdPtr; -} - -int -Itcl_SetClassVariableProtectionCallback( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - ItclCheckClassProtection *fcnPtr) -{ - ItclResolvingInfo *iriPtr; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - iriPtr->varProtFcn = fcnPtr; - return TCL_OK; -} - -int -Itcl_SetClassCommandProtectionCallback( - Tcl_Interp *interp, - Tcl_Namespace *nsPtr, - ItclCheckClassProtection *fcnPtr) -{ - ItclResolvingInfo *iriPtr; - - iriPtr = Tcl_GetAssocData(interp, ITCL_RESOLVE_DATA, NULL); - iriPtr->cmdProtFcn = fcnPtr; - return TCL_OK; -} diff --git a/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.h b/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.h deleted file mode 100644 index 966806b..0000000 --- a/tcl8.6/pkgs/itcl4.1.1/generic/itclVarsAndCmds.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * ------------------------------------------------------------------------ - * PACKAGE: [incr Tcl] - * DESCRIPTION: Object-Oriented Extensions to Tcl - * - * These procedures handle command and variable resolution - * - * ======================================================================== - * AUTHOR: Arnulf Wiedemann - * - * ======================================================================== - * Copyright (c) Arnulf Wiedemann - * ------------------------------------------------------------------------ - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -typedef int (ItclCheckClassProtection)(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *varName, ClientData clientData); - -ClientData Itcl_RegisterClassVariable(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, const char *varName, ClientData clientData); - -Tcl_Var Itcl_RegisterObjectVariable( Tcl_Interp *interp, ItclObject *ioPtr, - const char *varName, ClientData clientData, Tcl_Var varPtr, - Tcl_Namespace *nsPtr); - -ClientData Itcl_RegisterClassCommand(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - const char *cmdName, ClientData clientData); - -Tcl_Command Itcl_RegisterObjectCommand( Tcl_Interp *interp, ItclObject *ioPtr, - const char *cmdName, ClientData clientData, Tcl_Command cmdPtr, - Tcl_Namespace *nsPtr); - -int Itcl_CheckClassVariableProtection(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - const char *varName, ClientData clientData); - -int Itcl_CheckClassCommandProtection(Tcl_Interp *interp, Tcl_Namespace *nsPtr, - const char *cmdName, ClientData clientData); - -int Itcl_SetClassVariableProtectionCallback(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, ItclCheckClassProtection *fcnPtr); - -int Itcl_SetClassCommandProtectionCallback(Tcl_Interp *interp, - Tcl_Namespace *nsPtr, ItclCheckClassProtection *fcnPtr); - |