File indexing completed on 2024-05-18 08:30:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef TCL_OO_INTERNAL_H
0014 #define TCL_OO_INTERNAL_H 1
0015
0016 #include "tclInt.h"
0017 #include "tclOO.h"
0018
0019
0020
0021
0022
0023
0024 #ifdef __OBJC__
0025 #define Class TclOOClass
0026 #define Object TclOOObject
0027 #endif
0028
0029
0030
0031
0032
0033 struct CallChain;
0034 struct Class;
0035 struct Foundation;
0036 struct Object;
0037
0038
0039
0040
0041
0042
0043
0044 typedef struct Method {
0045 const Tcl_MethodType *typePtr;
0046
0047
0048
0049 int refCount;
0050 ClientData clientData;
0051 Tcl_Obj *namePtr;
0052 struct Object *declaringObjectPtr;
0053
0054
0055 struct Class *declaringClassPtr;
0056
0057
0058
0059 int flags;
0060
0061 } Method;
0062
0063
0064
0065
0066
0067
0068 typedef int (TclOO_PreCallProc)(ClientData clientData, Tcl_Interp *interp,
0069 Tcl_ObjectContext context, Tcl_CallFrame *framePtr, int *isFinished);
0070 typedef int (TclOO_PostCallProc)(ClientData clientData, Tcl_Interp *interp,
0071 Tcl_ObjectContext context, Tcl_Namespace *namespacePtr, int result);
0072 typedef void (TclOO_PmCDDeleteProc)(ClientData clientData);
0073 typedef ClientData (TclOO_PmCDCloneProc)(ClientData clientData);
0074
0075
0076
0077
0078
0079 typedef struct ProcedureMethod {
0080 int version;
0081
0082 Proc *procPtr;
0083
0084
0085 int flags;
0086 int refCount;
0087 ClientData clientData;
0088 TclOO_PmCDDeleteProc *deleteClientdataProc;
0089 TclOO_PmCDCloneProc *cloneClientdataProc;
0090 ProcErrorProc *errProc;
0091 TclOO_PreCallProc *preCallProc;
0092
0093
0094 TclOO_PostCallProc *postCallProc;
0095
0096
0097 GetFrameInfoValueProc *gfivProc;
0098
0099
0100 } ProcedureMethod;
0101
0102 #define TCLOO_PROCEDURE_METHOD_VERSION 0
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115 #define USE_DECLARER_NS 0x80
0116
0117
0118
0119
0120
0121 typedef struct ForwardMethod {
0122 Tcl_Obj *prefixObj;
0123
0124
0125 } ForwardMethod;
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 #define LIST_STATIC(listType_t) \
0140 struct { int num; listType_t *list; }
0141 #define LIST_DYNAMIC(listType_t) \
0142 struct { int num, size; listType_t *list; }
0143
0144
0145
0146
0147
0148 typedef struct Object {
0149 struct Foundation *fPtr;
0150
0151
0152
0153 Tcl_Namespace *namespacePtr;
0154 Tcl_Command command;
0155
0156 Tcl_Command myCommand;
0157
0158 struct Class *selfCls;
0159 Tcl_HashTable *methodsPtr;
0160
0161 LIST_STATIC(struct Class *) mixins;
0162
0163 LIST_STATIC(Tcl_Obj *) filters;
0164
0165 struct Class *classPtr;
0166
0167
0168 int refCount;
0169
0170
0171
0172 int flags;
0173 int creationEpoch;
0174
0175 int epoch;
0176
0177
0178 Tcl_HashTable *metadataPtr;
0179
0180
0181
0182
0183 Tcl_Obj *cachedNameObj;
0184 Tcl_HashTable *chainCache;
0185
0186 Tcl_ObjectMapMethodNameProc *mapMethodNameProc;
0187
0188
0189 LIST_STATIC(Tcl_Obj *) variables;
0190 } Object;
0191
0192 #define OBJECT_DESTRUCTING 1
0193
0194 #define DESTRUCTOR_CALLED 2
0195
0196 #define OO_UNUSED_4 4
0197 #define ROOT_OBJECT 0x1000
0198
0199
0200 #define FILTER_HANDLING 0x2000
0201
0202
0203
0204 #define USE_CLASS_CACHE 0x4000
0205
0206
0207
0208 #define ROOT_CLASS 0x8000
0209
0210
0211
0212 #define FORCE_UNKNOWN 0x10000
0213
0214 #define DONT_DELETE 0x20000
0215
0216
0217
0218
0219
0220
0221 typedef struct Class {
0222 Object *thisPtr;
0223
0224 int flags;
0225 LIST_STATIC(struct Class *) superclasses;
0226
0227
0228 LIST_DYNAMIC(struct Class *) subclasses;
0229
0230
0231
0232 LIST_DYNAMIC(Object *) instances;
0233
0234
0235
0236 LIST_STATIC(Tcl_Obj *) filters;
0237
0238
0239 LIST_STATIC(struct Class *) mixins;
0240
0241
0242 LIST_DYNAMIC(struct Class *) mixinSubs;
0243
0244
0245
0246
0247 Tcl_HashTable classMethods;
0248
0249
0250 Method *constructorPtr;
0251
0252 Method *destructorPtr;
0253
0254 Tcl_HashTable *metadataPtr;
0255
0256
0257
0258
0259 struct CallChain *constructorChainPtr;
0260 struct CallChain *destructorChainPtr;
0261 Tcl_HashTable *classChainCache;
0262
0263
0264
0265
0266
0267
0268
0269 LIST_STATIC(Tcl_Obj *) variables;
0270 } Class;
0271
0272
0273
0274
0275
0276
0277
0278
0279 typedef struct ThreadLocalData {
0280 int nsCount;
0281
0282
0283
0284
0285
0286 } ThreadLocalData;
0287
0288 typedef struct Foundation {
0289 Tcl_Interp *interp;
0290 Class *objectCls;
0291 Class *classCls;
0292 Tcl_Namespace *ooNs;
0293 Tcl_Namespace *defineNs;
0294
0295
0296
0297 Tcl_Namespace *objdefNs;
0298
0299
0300
0301 Tcl_Namespace *helpersNs;
0302
0303
0304 int epoch;
0305
0306 ThreadLocalData *tsdPtr;
0307
0308 Tcl_Obj *unknownMethodNameObj;
0309
0310
0311 Tcl_Obj *constructorName;
0312
0313 Tcl_Obj *destructorName;
0314
0315 Tcl_Obj *clonedName;
0316
0317 Tcl_Obj *defineName;
0318 } Foundation;
0319
0320
0321
0322
0323
0324
0325
0326
0327 #define CALL_CHAIN_STATIC_SIZE 4
0328
0329 struct MInvoke {
0330 Method *mPtr;
0331
0332 int isFilter;
0333 Class *filterDeclarer;
0334
0335 };
0336
0337 typedef struct CallChain {
0338 int objectCreationEpoch;
0339
0340
0341 int objectEpoch;
0342
0343 int epoch;
0344
0345 int flags;
0346 int refCount;
0347 int numChain;
0348 struct MInvoke *chain;
0349
0350
0351 struct MInvoke staticChain[CALL_CHAIN_STATIC_SIZE];
0352 } CallChain;
0353
0354 typedef struct CallContext {
0355 Object *oPtr;
0356 int index;
0357
0358 int skip;
0359
0360
0361
0362 CallChain *callPtr;
0363 } CallContext;
0364
0365
0366
0367
0368
0369 #define PUBLIC_METHOD 0x01
0370 #define PRIVATE_METHOD 0x02
0371
0372 #define OO_UNKNOWN_METHOD 0x04
0373 #define CONSTRUCTOR 0x08
0374 #define DESTRUCTOR 0x10
0375
0376
0377
0378
0379
0380 typedef struct {
0381 const char *name;
0382 int isPublic;
0383 Tcl_MethodType definition;
0384 } DeclaredClassMethod;
0385
0386
0387
0388
0389
0390
0391
0392 MODULE_SCOPE int TclOOInit(Tcl_Interp *interp);
0393 MODULE_SCOPE int TclOODefineObjCmd(ClientData clientData,
0394 Tcl_Interp *interp, int objc,
0395 Tcl_Obj *const *objv);
0396 MODULE_SCOPE int TclOOObjDefObjCmd(ClientData clientData,
0397 Tcl_Interp *interp, int objc,
0398 Tcl_Obj *const *objv);
0399 MODULE_SCOPE int TclOODefineConstructorObjCmd(ClientData clientData,
0400 Tcl_Interp *interp, int objc,
0401 Tcl_Obj *const *objv);
0402 MODULE_SCOPE int TclOODefineDeleteMethodObjCmd(ClientData clientData,
0403 Tcl_Interp *interp, int objc,
0404 Tcl_Obj *const *objv);
0405 MODULE_SCOPE int TclOODefineDestructorObjCmd(ClientData clientData,
0406 Tcl_Interp *interp, int objc,
0407 Tcl_Obj *const *objv);
0408 MODULE_SCOPE int TclOODefineExportObjCmd(ClientData clientData,
0409 Tcl_Interp *interp, int objc,
0410 Tcl_Obj *const *objv);
0411 MODULE_SCOPE int TclOODefineForwardObjCmd(ClientData clientData,
0412 Tcl_Interp *interp, int objc,
0413 Tcl_Obj *const *objv);
0414 MODULE_SCOPE int TclOODefineMethodObjCmd(ClientData clientData,
0415 Tcl_Interp *interp, int objc,
0416 Tcl_Obj *const *objv);
0417 MODULE_SCOPE int TclOODefineRenameMethodObjCmd(ClientData clientData,
0418 Tcl_Interp *interp, int objc,
0419 Tcl_Obj *const *objv);
0420 MODULE_SCOPE int TclOODefineUnexportObjCmd(ClientData clientData,
0421 Tcl_Interp *interp, int objc,
0422 Tcl_Obj *const *objv);
0423 MODULE_SCOPE int TclOODefineClassObjCmd(ClientData clientData,
0424 Tcl_Interp *interp, int objc,
0425 Tcl_Obj *const *objv);
0426 MODULE_SCOPE int TclOODefineSelfObjCmd(ClientData clientData,
0427 Tcl_Interp *interp, int objc,
0428 Tcl_Obj *const *objv);
0429 MODULE_SCOPE int TclOOUnknownDefinition(ClientData clientData,
0430 Tcl_Interp *interp, int objc,
0431 Tcl_Obj *const *objv);
0432 MODULE_SCOPE int TclOOCopyObjectCmd(ClientData clientData,
0433 Tcl_Interp *interp, int objc,
0434 Tcl_Obj *const *objv);
0435 MODULE_SCOPE int TclOONextObjCmd(ClientData clientData,
0436 Tcl_Interp *interp, int objc,
0437 Tcl_Obj *const *objv);
0438 MODULE_SCOPE int TclOONextToObjCmd(ClientData clientData,
0439 Tcl_Interp *interp, int objc,
0440 Tcl_Obj *const *objv);
0441 MODULE_SCOPE int TclOOSelfObjCmd(ClientData clientData,
0442 Tcl_Interp *interp, int objc,
0443 Tcl_Obj *const *objv);
0444
0445
0446
0447
0448
0449 MODULE_SCOPE int TclOO_Class_Constructor(ClientData clientData,
0450 Tcl_Interp *interp, Tcl_ObjectContext context,
0451 int objc, Tcl_Obj *const *objv);
0452 MODULE_SCOPE int TclOO_Class_Create(ClientData clientData,
0453 Tcl_Interp *interp, Tcl_ObjectContext context,
0454 int objc, Tcl_Obj *const *objv);
0455 MODULE_SCOPE int TclOO_Class_CreateNs(ClientData clientData,
0456 Tcl_Interp *interp, Tcl_ObjectContext context,
0457 int objc, Tcl_Obj *const *objv);
0458 MODULE_SCOPE int TclOO_Class_New(ClientData clientData,
0459 Tcl_Interp *interp, Tcl_ObjectContext context,
0460 int objc, Tcl_Obj *const *objv);
0461 MODULE_SCOPE int TclOO_Object_Destroy(ClientData clientData,
0462 Tcl_Interp *interp, Tcl_ObjectContext context,
0463 int objc, Tcl_Obj *const *objv);
0464 MODULE_SCOPE int TclOO_Object_Eval(ClientData clientData,
0465 Tcl_Interp *interp, Tcl_ObjectContext context,
0466 int objc, Tcl_Obj *const *objv);
0467 MODULE_SCOPE int TclOO_Object_LinkVar(ClientData clientData,
0468 Tcl_Interp *interp, Tcl_ObjectContext context,
0469 int objc, Tcl_Obj *const *objv);
0470 MODULE_SCOPE int TclOO_Object_Unknown(ClientData clientData,
0471 Tcl_Interp *interp, Tcl_ObjectContext context,
0472 int objc, Tcl_Obj *const *objv);
0473 MODULE_SCOPE int TclOO_Object_VarName(ClientData clientData,
0474 Tcl_Interp *interp, Tcl_ObjectContext context,
0475 int objc, Tcl_Obj *const *objv);
0476
0477
0478
0479
0480
0481
0482 MODULE_SCOPE void TclOOAddToInstances(Object *oPtr, Class *clsPtr);
0483 MODULE_SCOPE void TclOOAddToMixinSubs(Class *subPtr, Class *mixinPtr);
0484 MODULE_SCOPE void TclOOAddToSubclasses(Class *subPtr, Class *superPtr);
0485 MODULE_SCOPE Class * TclOOAllocClass(Tcl_Interp *interp,
0486 Object *useThisObj);
0487 MODULE_SCOPE int TclNRNewObjectInstance(Tcl_Interp *interp,
0488 Tcl_Class cls, const char *nameStr,
0489 const char *nsNameStr, int objc,
0490 Tcl_Obj *const *objv, int skip,
0491 Tcl_Object *objectPtr);
0492 MODULE_SCOPE Object * TclNewObjectInstanceCommon(Tcl_Interp *interp,
0493 Class *classPtr,
0494 const char *nameStr,
0495 const char *nsNameStr);
0496 MODULE_SCOPE int TclOODecrRefCount(Object *oPtr);
0497 MODULE_SCOPE int TclOOObjectDestroyed(Object *oPtr);
0498 MODULE_SCOPE int TclOODefineSlots(Foundation *fPtr);
0499 MODULE_SCOPE void TclOODeleteChain(CallChain *callPtr);
0500 MODULE_SCOPE void TclOODeleteChainCache(Tcl_HashTable *tablePtr);
0501 MODULE_SCOPE void TclOODeleteContext(CallContext *contextPtr);
0502 MODULE_SCOPE void TclOODeleteDescendants(Tcl_Interp *interp,
0503 Object *oPtr);
0504 MODULE_SCOPE void TclOODelMethodRef(Method *method);
0505 MODULE_SCOPE CallContext *TclOOGetCallContext(Object *oPtr,
0506 Tcl_Obj *methodNameObj, int flags,
0507 Tcl_Obj *cacheInThisObj);
0508 MODULE_SCOPE CallChain *TclOOGetStereotypeCallChain(Class *clsPtr,
0509 Tcl_Obj *methodNameObj, int flags);
0510 MODULE_SCOPE Foundation *TclOOGetFoundation(Tcl_Interp *interp);
0511 MODULE_SCOPE Tcl_Obj * TclOOGetFwdFromMethod(Method *mPtr);
0512 MODULE_SCOPE Proc * TclOOGetProcFromMethod(Method *mPtr);
0513 MODULE_SCOPE Tcl_Obj * TclOOGetMethodBody(Method *mPtr);
0514 MODULE_SCOPE int TclOOGetSortedClassMethodList(Class *clsPtr,
0515 int flags, const char ***stringsPtr);
0516 MODULE_SCOPE int TclOOGetSortedMethodList(Object *oPtr, int flags,
0517 const char ***stringsPtr);
0518 MODULE_SCOPE int TclOOInit(Tcl_Interp *interp);
0519 MODULE_SCOPE void TclOOInitInfo(Tcl_Interp *interp);
0520 MODULE_SCOPE int TclOOInvokeContext(ClientData clientData,
0521 Tcl_Interp *interp, int objc,
0522 Tcl_Obj *const objv[]);
0523 MODULE_SCOPE int TclNRObjectContextInvokeNext(Tcl_Interp *interp,
0524 Tcl_ObjectContext context, int objc,
0525 Tcl_Obj *const *objv, int skip);
0526 MODULE_SCOPE void TclOONewBasicMethod(Tcl_Interp *interp, Class *clsPtr,
0527 const DeclaredClassMethod *dcm);
0528 MODULE_SCOPE Tcl_Obj * TclOOObjectName(Tcl_Interp *interp, Object *oPtr);
0529 MODULE_SCOPE void TclOOReleaseClassContents(Tcl_Interp *interp,
0530 Object *oPtr);
0531 MODULE_SCOPE int TclOORemoveFromInstances(Object *oPtr, Class *clsPtr);
0532 MODULE_SCOPE int TclOORemoveFromMixins(Class *mixinPtr, Object *oPtr);
0533 MODULE_SCOPE int TclOORemoveFromMixinSubs(Class *subPtr,
0534 Class *mixinPtr);
0535 MODULE_SCOPE int TclOORemoveFromSubclasses(Class *subPtr,
0536 Class *superPtr);
0537 MODULE_SCOPE Tcl_Obj * TclOORenderCallChain(Tcl_Interp *interp,
0538 CallChain *callPtr);
0539 MODULE_SCOPE void TclOOStashContext(Tcl_Obj *objPtr,
0540 CallContext *contextPtr);
0541 MODULE_SCOPE void TclOOSetupVariableResolver(Tcl_Namespace *nsPtr);
0542
0543
0544
0545
0546
0547 #include "tclOOIntDecls.h"
0548
0549
0550
0551
0552
0553 #define AddRef(ptr) ((ptr)->refCount++)
0554
0555
0556
0557
0558
0559
0560
0561 #define FOREACH(var,ary) \
0562 for(i=0 ; i<(ary).num; i++) if ((ary).list[i] == NULL) { \
0563 continue; \
0564 } else if (var = (ary).list[i], 1)
0565
0566
0567
0568
0569
0570
0571
0572
0573 #define FOREACH_HASH_DECLS \
0574 Tcl_HashEntry *hPtr;Tcl_HashSearch search
0575 #define FOREACH_HASH(key,val,tablePtr) \
0576 for(hPtr=Tcl_FirstHashEntry((tablePtr),&search); hPtr!=NULL ? \
0577 ((key)=(void *)Tcl_GetHashKey((tablePtr),hPtr),\
0578 (val)=Tcl_GetHashValue(hPtr),1):0; hPtr=Tcl_NextHashEntry(&search))
0579 #define FOREACH_HASH_VALUE(val,tablePtr) \
0580 for(hPtr=Tcl_FirstHashEntry((tablePtr),&search); hPtr!=NULL ? \
0581 ((val)=Tcl_GetHashValue(hPtr),1):0;hPtr=Tcl_NextHashEntry(&search))
0582
0583
0584
0585
0586
0587
0588 #undef DUPLICATE
0589 #define DUPLICATE(target,source,type) \
0590 do { \
0591 size_t len = sizeof(type) * ((target).num=(source).num);\
0592 if (len != 0) { \
0593 memcpy(((target).list=(type*)ckalloc(len)), (source).list, len); \
0594 } else { \
0595 (target).list = NULL; \
0596 } \
0597 } while(0)
0598
0599 #endif
0600
0601
0602
0603
0604
0605
0606
0607