123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843 |
- /*
- * 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
- /*
- * MSVC 8.0 started to mark many standard C library functions depreciated
- * including the *printf family and others. Tell it to shut up.
- * (_MSC_VER is 1200 for VC6, 1300 or 1310 for vc7.net, 1400 for 8.0)
- */
- #if defined(_MSC_VER)
- # pragma warning(disable:4244)
- # if _MSC_VER >= 1400
- # pragma warning(disable:4267)
- # pragma warning(disable:4996)
- # endif
- #endif
- #ifndef JOIN
- # define JOIN(a,b) JOIN1(a,b)
- # define JOIN1(a,b) a##b
- #endif
- #ifndef TCL_UNUSED
- # if defined(__cplusplus)
- # define TCL_UNUSED(T) T
- # else
- # define TCL_UNUSED(T) T JOIN(dummy, __LINE__)
- # endif
- #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
- #if defined(NDEBUG) && !defined(DEBUG)
- #define assert(EX) ((void)0)
- #else /* !NDEBUG || DEBUG */
- #define assert(EX) (void)((EX) || (Itcl_Assert(STRINGIFY(EX), __FILE__, __LINE__), 0))
- #endif
- #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 ? \
- (*(void **)&(key)=Tcl_GetHashKey((tablePtr),hPtr),\
- *(void **)&(val)=Tcl_GetHashValue(hPtr),1):0; hPtr=Tcl_NextHashEntry(&search))
- #define FOREACH_HASH_VALUE(val,tablePtr) \
- for(hPtr=Tcl_FirstHashEntry((tablePtr),&search); hPtr!=NULL ? \
- (*(void **)&(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_INT_NAMESPACE ITCL_NAMESPACE"::internal"
- #define ITCL_INTDICTS_NAMESPACE ITCL_INT_NAMESPACE"::dicts"
- #define ITCL_VARIABLES_NAMESPACE ITCL_INT_NAMESPACE"::variables"
- #define ITCL_COMMANDS_NAMESPACE ITCL_INT_NAMESPACE"::commands"
- 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 clazzObjectPtr; /* 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;
- 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 *unused9;
- 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 /* unused */
- #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 */
- } 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 */
- } 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
- #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;
- 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) do {(void)(c);(void)(d);} while(0)
- #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 ItclPreserveClass(ItclClass *iclsPtr);
- MODULE_SCOPE void ItclReleaseClass(ClientData iclsPtr);
- 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);
- MODULE_SCOPE Tcl_HashEntry *ItclResolveVarEntry(
- ItclClass* iclsPtr, const char *varName);
- 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 ItclCreateMethodVariable(Tcl_Interp *interp,
- ItclVariable *ivPtr, Tcl_Obj* defaultPtr, Tcl_Obj* callbackPtr,
- ItclMethodVariable** imvPtrPtr);
- 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 void ItclRestoreInfoVars(ClientData clientData);
- 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"
- /*
- * Include all the private API, generated from itcl.decls.
- */
- #include "itclIntDecls.h"
|