Index: TODO =================================================================== diff -u -r8309bbb9459e29aa20e673d9f40d190522c1fff1 -r3c7047087688c6072761e4f1141e4bfe644daa1a --- TODO (.../TODO) (revision 8309bbb9459e29aa20e673d9f40d190522c1fff1) +++ TODO (.../TODO) (revision 3c7047087688c6072761e4f1141e4bfe644daa1a) @@ -5000,6 +5000,7 @@ - de-spaghetti precedence computations for multiple inheritance and improve documentation - get rid of // comments +- use nonnull variable attributes for prototpyes (nsf.h, nsfInt.h, nsf.c) ======================================================================== TODO: Index: generic/nsf.c =================================================================== diff -u -r8309bbb9459e29aa20e673d9f40d190522c1fff1 -r3c7047087688c6072761e4f1141e4bfe644daa1a --- generic/nsf.c (.../nsf.c) (revision 8309bbb9459e29aa20e673d9f40d190522c1fff1) +++ generic/nsf.c (.../nsf.c) (revision 3c7047087688c6072761e4f1141e4bfe644daa1a) @@ -207,156 +207,244 @@ /* Prototypes for methods called directly when CallDirectly() returns NULL */ -static int NsfCAllocMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *nameObj); -static int NsfCAllocMethod_(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *nameObj, Tcl_Namespace *parentNsPtr); -static int NsfCCreateMethod(Tcl_Interp *interp, NsfClass *cl, CONST char *name, int objc, Tcl_Obj *CONST objv[]); -static int NsfOCleanupMethod(Tcl_Interp *interp, NsfObject *object); -static int NsfOConfigureMethod(Tcl_Interp *interp, NsfObject *object, int objc, Tcl_Obj *CONST objv[]); -static int NsfODestroyMethod(Tcl_Interp *interp, NsfObject *object); +static int NsfCAllocMethod(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *nameObj) + nonnull(1) nonnull(2); +static int NsfCAllocMethod_(Tcl_Interp *interp, NsfClass *cl, Tcl_Obj *nameObj, Tcl_Namespace *parentNsPtr) + nonnull(1) nonnull(2) nonnull(3) nonnull(4); +static int NsfCCreateMethod(Tcl_Interp *interp, NsfClass *cl, CONST char *name, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2) nonnull(3) nonnull(5); +static int NsfOCleanupMethod(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); +static int NsfOConfigureMethod(Tcl_Interp *interp, NsfObject *object, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2) nonnull(4); +static int NsfODestroyMethod(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); static int MethodDispatch(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Tcl_Command cmd, NsfObject *object, NsfClass *cl, - CONST char *methodName, int frameType, int flags); -static int DispatchDefaultMethod(Tcl_Interp *interp, NsfObject *object, - Tcl_Obj *obj, int flags); -static int DispatchDestroyMethod(Tcl_Interp *interp, NsfObject *object, int flags); + CONST char *methodName, int frameType, int flags) + nonnull(1) nonnull(2) nonnull(4) nonnull(5) nonnull(6) nonnull(8); +static int DispatchDefaultMethod(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *obj, int flags) + nonnull(1) nonnull(2) nonnull(3); +static int DispatchDestroyMethod(Tcl_Interp *interp, NsfObject *object, int flags) + nonnull(1) nonnull(2); static int DispatchUnknownMethod(Tcl_Interp *interp, NsfObject *object, int objc, Tcl_Obj *CONST objv[], Tcl_Obj *callInfo, - Tcl_Obj *methodObj, int flags); + Tcl_Obj *methodObj, int flags) + nonnull(1) nonnull(2) nonnull(4) nonnull(6); NSF_INLINE static int ObjectDispatch(ClientData clientData, Tcl_Interp *interp, int objc, - Tcl_Obj *CONST objv[], int flags); + Tcl_Obj *CONST objv[], int flags) + nonnull(1) nonnull(2) nonnull(4); + NSF_INLINE static int ObjectDispatchFinalize(Tcl_Interp *interp, NsfCallStackContent *cscPtr, - int result /*, char *string , CONST char *methodName*/); + int result /*, char *string , CONST char *methodName*/) + nonnull(1) nonnull(2); /* prototypes for object life-cycle management */ -static int RecreateObject(Tcl_Interp *interp, NsfClass *cl, NsfObject *object, int objc, Tcl_Obj *CONST objv[]); -static void FinalObjectDeletion(Tcl_Interp *interp, NsfObject *object); +static int RecreateObject(Tcl_Interp *interp, NsfClass *cl, NsfObject *object, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2) nonnull(3) nonnull(5); +static void FinalObjectDeletion(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); + #if defined(DO_CLEANUP) -static void FreeAllNsfObjectsAndClasses(Tcl_Interp *interp, NsfCmdList **instances); +static void FreeAllNsfObjectsAndClasses(Tcl_Interp *interp, NsfCmdList **instances) + nonnull(1) nonnull(2); #endif -static void CallStackDestroyObject(Tcl_Interp *interp, NsfObject *object); -static void PrimitiveCDestroy(ClientData clientData); -static void PrimitiveODestroy(ClientData clientData); -static void PrimitiveDestroy(ClientData clientData); -static void NsfCleanupObject_(NsfObject *object); +static void CallStackDestroyObject(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); +static void PrimitiveCDestroy(ClientData clientData) + nonnull(1); +static void PrimitiveODestroy(ClientData clientData) + nonnull(1); +static void PrimitiveDestroy(ClientData clientData) + nonnull(1); +static void NsfCleanupObject_(NsfObject *object) + nonnull(1); /* prototypes for object and command lookup */ -static NsfObject *GetObjectFromString(Tcl_Interp *interp, CONST char *name); -static NsfClass *GetClassFromString(Tcl_Interp *interp, CONST char *name); -static int GetClassFromObj(Tcl_Interp *interp, register Tcl_Obj *objPtr, NsfClass **clPtr, int withUnknown); +static NsfObject *GetObjectFromString(Tcl_Interp *interp, CONST char *name) + nonnull(1) nonnull(2); +static NsfClass *GetClassFromString(Tcl_Interp *interp, CONST char *name) + nonnull(1) nonnull(2); +static int GetClassFromObj(Tcl_Interp *interp, register Tcl_Obj *objPtr, NsfClass **clPtr, int withUnknown) + nonnull(1) nonnull(2) nonnull(3); /*static NsfObject *GetHiddenObjectFromCmd(Tcl_Interp *interp, Tcl_Command cmdPtr); static int ReverseLookupCmdFromCmdTable(Tcl_Interp *interp, Tcl_Command searchCmdPtr, Tcl_HashTable *cmdTablePtr);*/ -static void GetAllInstances(Tcl_Interp *interp, NsfCmdList **instances, NsfClass *startClass); -NSF_INLINE static Tcl_Command FindMethod(Tcl_Namespace *nsPtr, CONST char *methodName); +static void GetAllInstances(Tcl_Interp *interp, NsfCmdList **instances, NsfClass *startClass) + nonnull(1) nonnull(2) nonnull(3); +NSF_INLINE static Tcl_Command FindMethod(Tcl_Namespace *nsPtr, CONST char *methodName) + nonnull(1) nonnull(2); /* prototypes for namespace specific calls */ -static Tcl_Obj *NameInNamespaceObj(Tcl_Interp *interp, CONST char *name, Tcl_Namespace *ns); -static Tcl_Namespace *CallingNameSpace(Tcl_Interp *interp); -NSF_INLINE static Tcl_Command NSFindCommand(Tcl_Interp *interp, CONST char *name); -static Tcl_Namespace *NSGetFreshNamespace(Tcl_Interp *interp, NsfObject *object, - CONST char *name); -static Tcl_Namespace *RequireObjNamespace(Tcl_Interp *interp, NsfObject *object); -static int NSDeleteCmd(Tcl_Interp *interp, Tcl_Namespace *nsPtr, CONST char *methodName); -static void NSNamespaceDeleteProc(ClientData clientData); -static void NSNamespacePreserve(Tcl_Namespace *nsPtr); -static void NSNamespaceRelease(Tcl_Namespace *nsPtr); +static Tcl_Obj *NameInNamespaceObj(Tcl_Interp *interp, CONST char *name, Tcl_Namespace *ns) + nonnull(1) nonnull(2) nonnull(3); +static Tcl_Namespace *CallingNameSpace(Tcl_Interp *interp) + nonnull(1); +NSF_INLINE static Tcl_Command NSFindCommand(Tcl_Interp *interp, CONST char *name) + nonnull(1) nonnull(2); +static Tcl_Namespace *NSGetFreshNamespace(Tcl_Interp *interp, NsfObject *object, CONST char *name) + nonnull(1) nonnull(2) nonnull(3); +static Tcl_Namespace *RequireObjNamespace(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); +static int NSDeleteCmd(Tcl_Interp *interp, Tcl_Namespace *nsPtr, CONST char *methodName) + nonnull(1) nonnull(2) nonnull(3); +static void NSNamespaceDeleteProc(ClientData clientData) + nonnull(1); +static void NSNamespacePreserve(Tcl_Namespace *nsPtr) + nonnull(1); +static void NSNamespaceRelease(Tcl_Namespace *nsPtr) + nonnull(1); /* prototypes for filters and mixins */ -static void FilterComputeDefined(Tcl_Interp *interp, NsfObject *object); -static void MixinComputeDefined(Tcl_Interp *interp, NsfObject *object); -NSF_INLINE static void GuardAdd(NsfCmdList *filterCL, Tcl_Obj *guardObj); +static void FilterComputeDefined(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); +static void MixinComputeDefined(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); +NSF_INLINE static void GuardAdd(NsfCmdList *filterCL, Tcl_Obj *guardObj) + nonnull(1) nonnull(2); static int GuardCall(NsfObject *object, Tcl_Interp *interp, - Tcl_Obj *guardObj, NsfCallStackContent *cscPtr); -static void GuardDel(NsfCmdList *filterCL); + Tcl_Obj *guardObj, NsfCallStackContent *cscPtr) + nonnull(1) nonnull(2) nonnull(3); +static void GuardDel(NsfCmdList *filterCL) + nonnull(1); /* prototypes for forwarders */ -static void ForwardCmdDeleteProc(ClientData clientData); +static void ForwardCmdDeleteProc(ClientData clientData) + nonnull(1); static int ForwardProcessOptions(Tcl_Interp *interp, Tcl_Obj *nameObj, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjframe, int withVerbose, Tcl_Obj *target, int objc, Tcl_Obj * CONST objv[], - ForwardCmdClientData **tcdPtr); + ForwardCmdClientData **tcdPtr) + nonnull(1) nonnull(2) nonnull(8) nonnull(10); /* properties of objects and classes */ -static int IsBaseClass(NsfObject *cl); -static int IsMetaClass(Tcl_Interp *interp, NsfClass *cl, int withMixins); -static int IsSubType(NsfClass *subcl, NsfClass *cl); -static NsfClass *DefaultSuperClass(Tcl_Interp *interp, NsfClass *cl, NsfClass *mcl, int isMeta); +static int IsBaseClass(NsfObject *cl) + nonnull(1); +static int IsMetaClass(Tcl_Interp *interp, NsfClass *cl, int withMixins) + nonnull(1) nonnull(2); +static int IsSubType(NsfClass *subcl, NsfClass *cl) + nonnull(1) nonnull(2); +static NsfClass *DefaultSuperClass(Tcl_Interp *interp, NsfClass *cl, NsfClass *mcl, int isMeta) + nonnull(1) nonnull(2) nonnull(3); + /* prototypes for call stack specific calls */ NSF_INLINE static void CscInit_(NsfCallStackContent *cscPtr, NsfObject *object, NsfClass *cl, - Tcl_Command cmd, int frameType, int flags); -NSF_INLINE static void CscFinish_(Tcl_Interp *interp, NsfCallStackContent *cscPtr); -NSF_INLINE static void CallStackDoDestroy(Tcl_Interp *interp, NsfObject *object); + Tcl_Command cmd, int frameType, int flags) + nonnull(1) nonnull(2) nonnull(3); +NSF_INLINE static void CscFinish_(Tcl_Interp *interp, NsfCallStackContent *cscPtr) + nonnull(1) nonnull(2); +NSF_INLINE static void CallStackDoDestroy(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); + /* prototypes for parameter and argument management */ -static int NsfParameterInvalidateClassCacheCmd(Tcl_Interp *interp, NsfClass *cl); +static int NsfParameterInvalidateClassCacheCmd(Tcl_Interp *interp, NsfClass *cl) + nonnull(1) nonnull(2); static int ProcessMethodArguments(ParseContext *pcPtr, Tcl_Interp *interp, NsfObject *object, int processFlags, NsfParamDefs *paramDefs, - Tcl_Obj *methodNameObj, int objc, Tcl_Obj *CONST objv[]); + Tcl_Obj *methodNameObj, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2) nonnull(5) nonnull(6) nonnull(8); + static int ParameterCheck(Tcl_Interp *interp, Tcl_Obj *paramObjPtr, Tcl_Obj *valueObj, const char *argNamePrefix, int doCheckArguments, int isNamed, int doConfigureParameter, - Nsf_Param **paramPtrPtr); -static void ParamDefsRefCountIncr(NsfParamDefs *paramDefs); -static void ParamDefsRefCountDecr(NsfParamDefs *paramDefs); -static int ParamSetFromAny(Tcl_Interp *interp, register Tcl_Obj *objPtr); + Nsf_Param **paramPtrPtr) + nonnull(1) nonnull(2) nonnull(3); +static void ParamDefsRefCountIncr(NsfParamDefs *paramDefs) + nonnull(1); +static void ParamDefsRefCountDecr(NsfParamDefs *paramDefs) + nonnull(1); +static int ParamSetFromAny(Tcl_Interp *interp, register Tcl_Obj *objPtr) + nonnull(1) nonnull(2); + static int ArgumentParse(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], NsfObject *obj, Tcl_Obj *procName, Nsf_Param CONST *paramPtr, int nrParameters, int serial, - int processFlags, ParseContext *pc); + int processFlags, ParseContext *pc) + nonnull(1) nonnull(3) nonnull(5) nonnull(6) nonnull(10); + static int ArgumentCheck(Tcl_Interp *interp, Tcl_Obj *objPtr, struct Nsf_Param CONST *pPtr, int doCheckArguments, - int *flags, ClientData *clientData, Tcl_Obj **outObjPtr); + int *flags, ClientData *clientData, Tcl_Obj **outObjPtr) + nonnull(1) nonnull(2) nonnull(3) nonnull(5) nonnull(6) nonnull(7); + static int GetMatchObject(Tcl_Interp *interp, Tcl_Obj *patternObj, Tcl_Obj *origObj, - NsfObject **matchObject, CONST char **pattern); -static void NsfProcDeleteProc(ClientData clientData); -static int NsfParameterInvalidateObjectCacheCmd(Tcl_Interp *interp, NsfObject *object); + NsfObject **matchObject, CONST char **pattern) + nonnull(1) nonnull(2) nonnull(4) nonnull(5); +static void NsfProcDeleteProc(ClientData clientData) + nonnull(1); +static int NsfParameterInvalidateObjectCacheCmd(Tcl_Interp *interp, NsfObject *object) + nonnull(1) nonnull(2); + /* prototypes for alias management */ -static int AliasDelete(Tcl_Interp *interp, Tcl_Obj *cmdName, CONST char *methodName, int withPer_object); +static int AliasDelete(Tcl_Interp *interp, Tcl_Obj *cmdName, CONST char *methodName, int withPer_object) + nonnull(1) nonnull(2) nonnull(3); static Tcl_Obj *AliasGet(Tcl_Interp *interp, Tcl_Obj *cmdName, CONST char *methodName, - int withPer_object, int leaveError); -static int AliasDeleteObjectReference(Tcl_Interp *interp, Tcl_Command cmd); + int withPer_object, int leaveError) + nonnull(1) nonnull(2) nonnull(3); +static int AliasDeleteObjectReference(Tcl_Interp *interp, Tcl_Command cmd) + nonnull(1) nonnull(2); static int NsfMethodAliasCmd(Tcl_Interp *interp, NsfObject *object, int withPer_object, - CONST char *methodName, int withFrame, Tcl_Obj *cmdName); + CONST char *methodName, int withFrame, Tcl_Obj *cmdName) + nonnull(1) nonnull(2) nonnull(4); static int AliasRefetch(Tcl_Interp *interp, NsfObject *object, CONST char *methodName, - AliasCmdClientData *tcd); -NSF_INLINE -static Tcl_Command AliasDereference(Tcl_Interp *interp, NsfObject *object, - CONST char *methodName, Tcl_Command cmd); + AliasCmdClientData *tcd) + nonnull(1) nonnull(2) nonnull(3) nonnull(4); +NSF_INLINE static Tcl_Command AliasDereference(Tcl_Interp *interp, NsfObject *object, + CONST char *methodName, Tcl_Command cmd) + nonnull(1) nonnull(2) nonnull(3) nonnull(4); /* prototypes for (class) list handling */ -static NsfClasses ** NsfClassListAdd(NsfClasses **firstPtrPtr, NsfClass *cl, ClientData clientData); -static void NsfClassListFree(NsfClasses *firstPtr); +static NsfClasses ** NsfClassListAdd(NsfClasses **firstPtrPtr, NsfClass *cl, ClientData clientData) + nonnull(1); +static void NsfClassListFree(NsfClasses *firstPtr) + nonnull(1); + /* misc prototypes */ -static int SetInstVar(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *nameObj, Tcl_Obj *valueObj); +static int SetInstVar(Tcl_Interp *interp, NsfObject *object, Tcl_Obj *nameObj, Tcl_Obj *valueObj) + nonnull(1) nonnull(2) nonnull(3); + static int ListDefinedMethods(Tcl_Interp *interp, NsfObject *object, CONST char *pattern, int withPer_object, int methodType, int withCallproctection, - int withPath); + int withPath) + nonnull(1) nonnull(2); + static int NextSearchAndInvoke(Tcl_Interp *interp, CONST char *methodName, int objc, Tcl_Obj *CONST objv[], - NsfCallStackContent *cscPtr, int freeArgumentVector); + NsfCallStackContent *cscPtr, int freeArgumentVector) + nonnull(1) nonnull(2) nonnull(4) nonnull(5); -static void CmdListFree(NsfCmdList **cmdList, NsfFreeCmdListClientData *freeFct); -static void NsfCommandPreserve(Tcl_Command cmd); -static void NsfCommandRelease(Tcl_Command cmd); -static Tcl_Command GetOriginalCommand(Tcl_Command cmd); -EXTERN void NsfDStringArgv(Tcl_DString *dsPtr, int objc, Tcl_Obj *CONST objv[]); +static void CmdListFree(NsfCmdList **cmdList, NsfFreeCmdListClientData *freeFct) + nonnull(1); +static void NsfCommandPreserve(Tcl_Command cmd) + nonnull(1); +static void NsfCommandRelease(Tcl_Command cmd) + nonnull(1); +static Tcl_Command GetOriginalCommand(Tcl_Command cmd) + nonnull(1); + +EXTERN void NsfDStringArgv(Tcl_DString *dsPtr, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(3); static int MethodSourceMatches(int withSource, NsfClass *cl, NsfObject *object); #ifdef DO_CLEANUP -static void DeleteNsfProcs(Tcl_Interp *interp, Tcl_Namespace *nsPtr); +static void DeleteNsfProcs(Tcl_Interp *interp, Tcl_Namespace *nsPtr) + nonnull(1); #endif #if defined(NSF_WITH_ASSERTIONS) -static void AssertionRemoveProc(NsfAssertionStore *aStore, CONST char *name); +static void AssertionRemoveProc(NsfAssertionStore *aStore, CONST char *name) + nonnull(1) nonnull(2); #endif #ifdef DO_FULL_CLEANUP -static void DeleteProcsAndVars(Tcl_Interp *interp, Tcl_Namespace *nsPtr, int withKeepvars); +static void DeleteProcsAndVars(Tcl_Interp *interp, Tcl_Namespace *nsPtr, int withKeepvars) + nonnull(1) nonnull(2); #endif /* Index: generic/nsf.h =================================================================== diff -u -rd29a51c38be834fe558f1c85069d8bc500d201d9 -r3c7047087688c6072761e4f1141e4bfe644daa1a --- generic/nsf.h (.../nsf.h) (revision d29a51c38be834fe558f1c85069d8bc500d201d9) +++ generic/nsf.h (.../nsf.h) (revision 3c7047087688c6072761e4f1141e4bfe644daa1a) @@ -344,33 +344,55 @@ #define NSF_ARG_SLOTASSIGN 0x00800000 #define NSF_ARG_SLOTINITIALIZE 0x01000000 +#undef __GNUC_PREREQ +#if defined __GNUC__ && defined __GNUC_MINOR__ +# define __GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +# define __GNUC_PREREQ(maj, min) (0) +#endif +#if __GNUC_PREREQ(3, 3) +# define NSF_nonnull(ARGS) __attribute__((__nonnull__(ARGS))) +#else +# define NSF_nonnull(ARGS) +#endif EXTERN int Nsf_ArgumentParse(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Nsf_Object *object, Tcl_Obj *procNameObj, Nsf_Param CONST *paramPtr, int nrParams, int serial, - int doCheck, Nsf_ParseContext *pcPtr); + int doCheck, Nsf_ParseContext *pcPtr) + NSF_nonnull(1) NSF_nonnull(3) NSF_nonnull(4) NSF_nonnull(5) NSF_nonnull(10); + EXTERN int NsfArgumentError(Tcl_Interp *interp, CONST char *errorMsg, Nsf_Param CONST *paramPtr, - Tcl_Obj *cmdNameObj, Tcl_Obj *methodObj); + Tcl_Obj *cmdNameObj, Tcl_Obj *methodObj) + NSF_nonnull(1) NSF_nonnull(2) NSF_nonnull(3) NSF_nonnull(5); + EXTERN int NsfDispatchClientDataError(Tcl_Interp *interp, ClientData clientData, - CONST char *what, CONST char *methodName); + CONST char *what, CONST char *methodName) + NSF_nonnull(1) NSF_nonnull(3) NSF_nonnull(4); + EXTERN int -NsfNoCurrentObjectError(Tcl_Interp *interp, CONST char *what); +NsfNoCurrentObjectError(Tcl_Interp *interp, CONST char *what) + NSF_nonnull(1); EXTERN int NsfUnexpectedArgumentError(Tcl_Interp *interp, CONST char *argumentString, Nsf_Object *object, Nsf_Param CONST *paramPtr, - Tcl_Obj *procNameObj); + Tcl_Obj *procNameObj) + NSF_nonnull(1) NSF_nonnull(2) NSF_nonnull(3) NSF_nonnull(4) NSF_nonnull(5); + EXTERN int NsfUnexpectedNonposArgumentError(Tcl_Interp *interp, CONST char *argumentString, Nsf_Object *object, Nsf_Param CONST *currentParamPtr, Nsf_Param CONST *paramPtr, - Tcl_Obj *procNameObj); + Tcl_Obj *procNameObj) + NSF_nonnull(1) NSF_nonnull(2) NSF_nonnull(3) NSF_nonnull(4) NSF_nonnull(5) NSF_nonnull(6); /* * logging @@ -379,19 +401,31 @@ #define NSF_LOG_WARN 1 EXTERN void -NsfLog(Tcl_Interp *interp, int requiredLevel, CONST char *fmt, ...); +NsfLog(Tcl_Interp *interp, int requiredLevel, CONST char *fmt, ...) + NSF_nonnull(1) NSF_nonnull(3); /* * Nsf Pointer converter interface */ -EXTERN int Nsf_PointerAdd(Tcl_Interp *interp, char *buffer, CONST char *typeName, void *valuePtr); -EXTERN int Nsf_PointerDelete(CONST char *key, void *valuePtr, int free); -EXTERN void Nsf_PointerInit(Tcl_Interp *interp); -EXTERN void Nsf_PointerExit(Tcl_Interp *interp); -EXTERN void *Nsf_PointerTypeLookup(Tcl_Interp *interp, CONST char* typeName); -EXTERN int Nsf_PointerTypeRegister(Tcl_Interp *interp, CONST char* typeName, int *counterPtr); +EXTERN int Nsf_PointerAdd(Tcl_Interp *interp, char *buffer, CONST char *typeName, void *valuePtr) + NSF_nonnull(1) NSF_nonnull(2) NSF_nonnull(3) NSF_nonnull(4); +EXTERN int Nsf_PointerDelete(CONST char *key, void *valuePtr, int free) + NSF_nonnull(1) NSF_nonnull(2); + +EXTERN void Nsf_PointerInit(Tcl_Interp *interp) + NSF_nonnull(1); + +EXTERN void Nsf_PointerExit(Tcl_Interp *interp) + NSF_nonnull(1); + +EXTERN void *Nsf_PointerTypeLookup(Tcl_Interp *interp, CONST char* typeName) + NSF_nonnull(1) NSF_nonnull(2); + +EXTERN int Nsf_PointerTypeRegister(Tcl_Interp *interp, CONST char* typeName, int *counterPtr) + NSF_nonnull(1) NSF_nonnull(2) NSF_nonnull(3); + /* * methodDefinition */ @@ -406,12 +440,15 @@ /* * Nsf Enumeration type interface */ -EXTERN int Nsf_EnumerationTypeRegister(Tcl_Interp *interp, Nsf_EnumeratorConverterEntry *typeRecords); +EXTERN int Nsf_EnumerationTypeRegister(Tcl_Interp *interp, Nsf_EnumeratorConverterEntry *typeRecords) + NSF_nonnull(1) NSF_nonnull(2); + /* * Nsf Cmd definition interface */ -EXTERN int Nsf_CmdDefinitionRegister(Tcl_Interp *interp, Nsf_methodDefinition *definitionRecords); +EXTERN int Nsf_CmdDefinitionRegister(Tcl_Interp *interp, Nsf_methodDefinition *definitionRecords) + NSF_nonnull(1) NSF_nonnull(2); /* Index: generic/nsfInt.h =================================================================== diff -u -rd29a51c38be834fe558f1c85069d8bc500d201d9 -r3c7047087688c6072761e4f1141e4bfe644daa1a --- generic/nsfInt.h (.../nsfInt.h) (revision d29a51c38be834fe558f1c85069d8bc500d201d9) +++ generic/nsfInt.h (.../nsfInt.h) (revision 3c7047087688c6072761e4f1141e4bfe644daa1a) @@ -65,7 +65,7 @@ # include #endif -#if defined(__GNUC__) && __GNUC__ > 2 +#if __GNUC_PREREQ(2, 95) /* Use gcc branch prediction hint to minimize cost of e.g. DTrace * ENABLED checks. */ @@ -76,6 +76,25 @@ # define likely(x) (x) #endif +#if __GNUC_PREREQ(3, 3) +# define nonnull(ARGS) __attribute__((__nonnull__(ARGS))) +#else +# define nonnull(ARGS) +#endif + +/* + * Tries to use gcc __attribute__ unused and mangles the name, so the + * attribute could not be used, if declared as unused. + */ +#ifdef UNUSED +#elif __GNUC_PREREQ(2, 7) +# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) +#elif defined(__LCLINT__) +# define UNUSED(x) /*@unused@*/ x +#else +# define UNUSED(x) x +#endif + #if defined(NSF_DTRACE) # include "nsfDTrace.h" # define NSF_DTRACE_METHOD_ENTRY_ENABLED() unlikely(NSF_METHOD_ENTRY_ENABLED()) @@ -136,19 +155,6 @@ MEM_COUNT_ALLOC(#target, target) # define STRING_FREE(key, p) MEM_COUNT_FREE(key, p); ckfree((p)) -/* - * Tries to use gcc __attribute__ unused and mangles the name, so the - * attribute could not be used, if declared as unused. - */ -#ifdef UNUSED -#elif defined(__GNUC__) -# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) -#elif defined(__LCLINT__) -# define UNUSED(x) /*@unused@*/ x -#else -# define UNUSED(x) x -#endif - #define DSTRING_INIT(dsPtr) Tcl_DStringInit(dsPtr); MEM_COUNT_ALLOC("DString",dsPtr) #define DSTRING_FREE(dsPtr) \ if ((dsPtr)->string != (dsPtr)->staticSpace) {Tcl_DStringFree(dsPtr);} MEM_COUNT_FREE("DString",dsPtr) @@ -662,10 +668,12 @@ /* obj types */ EXTERN Tcl_ObjType NsfMixinregObjType; -int NsfMixinregGet(Tcl_Obj *obj, NsfClass **clPtr, Tcl_Obj **guardObj); +int NsfMixinregGet(Tcl_Obj *obj, NsfClass **clPtr, Tcl_Obj **guardObj) + nonnull(1) nonnull(2) nonnull(3); EXTERN Tcl_ObjType NsfFilterregObjType; -int NsfFilterregGet(Tcl_Obj *obj, Tcl_Obj **filterObj, Tcl_Obj **guardObj); +int NsfFilterregGet(Tcl_Obj *obj, Tcl_Obj **filterObj, Tcl_Obj **guardObj) + nonnull(1) nonnull(2) nonnull(3); /* Next Scripting ShadowTclCommands */ typedef struct NsfShadowTclCommandInfo { @@ -679,11 +687,17 @@ NSF_PARAMS_PARAMETER, NSF_PARAMS_SYNTAX} NsfParamsPrintStyle; int NsfCallCommand(Tcl_Interp *interp, NsfGlobalNames name, - int objc, Tcl_Obj *CONST objv[]); -int NsfShadowTclCommands(Tcl_Interp *interp, NsfShadowOperations load); -Tcl_Obj * NsfMethodObj(NsfObject *object, int methodIdx); + int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(4); +int NsfShadowTclCommands(Tcl_Interp *interp, NsfShadowOperations load) + nonnull(1); +Tcl_Obj *NsfMethodObj(NsfObject *object, int methodIdx) + nonnull(1); + + + /* * Next Scripting CallStack */ @@ -844,13 +858,17 @@ #ifdef NSF_OBJECTDATA EXTERN void -NsfSetObjectData(struct NsfObject *obj, struct NsfClass *cl, ClientData data); +NsfSetObjectData(struct NsfObject *obj, struct NsfClass *cl, ClientData data) + nonnull(1) nonnull(2) nonnull(3); EXTERN int -NsfGetObjectData(struct NsfObject *obj, struct NsfClass *cl, ClientData *data); +NsfGetObjectData(struct NsfObject *obj, struct NsfClass *cl, ClientData *data) + nonnull(1) nonnull(2) nonnull(3); EXTERN int -NsfUnsetObjectData(struct NsfObject *obj, struct NsfClass *cl); +NsfUnsetObjectData(struct NsfObject *obj, struct NsfClass *cl) + nonnull(1) nonnull(2); EXTERN void -NsfFreeObjectData(NsfClass *cl); +NsfFreeObjectData(NsfClass *cl) + nonnull(1); #endif /* @@ -888,13 +906,20 @@ */ #if defined(NSF_PROFILE) -EXTERN void NsfProfileRecordMethodData(Tcl_Interp* interp, NsfCallStackContent *cscPtr); -EXTERN void NsfProfileRecordProcData(Tcl_Interp *interp, char *methodName, long startSec, long startUsec); -EXTERN void NsfProfileInit(Tcl_Interp *interp); -EXTERN void NsfProfileFree(Tcl_Interp *interp); -EXTERN void NsfProfileClearData(Tcl_Interp *interp); -EXTERN void NsfProfileGetData(Tcl_Interp *interp); -EXTERN NsfCallStackContent *NsfCallStackGetTopFrame(Tcl_Interp *interp, Tcl_CallFrame **framePtrPtr); +EXTERN void NsfProfileRecordMethodData(Tcl_Interp* interp, NsfCallStackContent *cscPtr) + nonnull(1) nonnull(2); +EXTERN void NsfProfileRecordProcData(Tcl_Interp *interp, char *methodName, long startSec, long startUsec) + nonnull(1) nonnull(2); +EXTERN void NsfProfileInit(Tcl_Interp *interp) + nonnull(1); +EXTERN void NsfProfileFree(Tcl_Interp *interp) + nonnull(1); +EXTERN void NsfProfileClearData(Tcl_Interp *interp) + nonnull(1); +EXTERN void NsfProfileGetData(Tcl_Interp *interp) + nonnull(1); +EXTERN NsfCallStackContent *NsfCallStackGetTopFrame(Tcl_Interp *interp, Tcl_CallFrame **framePtrPtr) + nonnull(1) nonnull(2); #endif /* @@ -945,23 +970,32 @@ EXTERN NsfCompEnv *NsfGetCompEnv(); int NsfDirectSelfDispatch(ClientData cd, Tcl_Interp *interp, - int objc, Tcl_Obj *CONST objv[]); + int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2); #endif EXTERN int NsfGetClassFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, - NsfClass **clPtr, int withUnknown); + NsfClass **clPtr, int withUnknown) + nonnull(1) nonnull(2) nonnull(3); EXTERN int NsfObjDispatch(ClientData cd, Tcl_Interp *interp, - int objc, Tcl_Obj *CONST objv[]); + int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(2) nonnull(4); EXTERN int NsfObjWrongArgs(Tcl_Interp *interp, CONST char *msg, Tcl_Obj *cmdName, Tcl_Obj *methodName, - char *arglist); -EXTERN CONST char *NsfMethodName(Tcl_Obj *methodObj); -EXTERN void NsfReportVars(Tcl_Interp *interp); -EXTERN void NsfDStringArgv(Tcl_DString *dsPtr, int objc, Tcl_Obj *CONST objv[]); + char *arglist) + nonnull(1) nonnull(2) nonnull(3) nonnull(5); +EXTERN CONST char *NsfMethodName(Tcl_Obj *methodObj) + nonnull(1); +EXTERN void NsfReportVars(Tcl_Interp *interp) + nonnull(1); +EXTERN void NsfDStringArgv(Tcl_DString *dsPtr, int objc, Tcl_Obj *CONST objv[]) + nonnull(1) nonnull(3); + EXTERN Tcl_Obj *NsfMethodNamePath(Tcl_Interp *interp, Tcl_CallFrame *framePtr, - CONST char *methodName); + CONST char *methodName) + nonnull(1) nonnull(3); /* * Definition of methodEpoch macros @@ -1010,8 +1044,12 @@ EXTERN int NsfMethodObjSet(Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_ObjType *objectType, void *context, int methodEpoch, - Tcl_Command cmd, NsfClass *cl, int flags); + Tcl_Command cmd, NsfClass *cl, int flags) + nonnull(1) nonnull(2) nonnull(3) nonnull(4) nonnull(6); + + + typedef struct { void *context; int methodEpoch; @@ -1021,24 +1059,37 @@ } NsfMethodContext; /* functions from nsfUtil.c */ -char *Nsf_ltoa(char *buf, long i, int *len); -char *NsfStringIncr(NsfStringIncrStruct *iss); -void NsfStringIncrInit(NsfStringIncrStruct *iss); -void NsfStringIncrFree(NsfStringIncrStruct *iss); +char *Nsf_ltoa(char *buf, long i, int *len) + nonnull(1) nonnull(3); +char *NsfStringIncr(NsfStringIncrStruct *iss) + nonnull(1); + +void NsfStringIncrInit(NsfStringIncrStruct *iss) + nonnull(1); + +void NsfStringIncrFree(NsfStringIncrStruct *iss) + nonnull(1); + /* * Nsf Enumeration type interface */ -EXTERN void Nsf_EnumerationTypeInit(Tcl_Interp *interp); -EXTERN CONST char *Nsf_EnumerationTypeGetDomain(Nsf_TypeConverter *converter); +EXTERN void Nsf_EnumerationTypeInit(Tcl_Interp *interp) + nonnull(1); +EXTERN CONST char *Nsf_EnumerationTypeGetDomain(Nsf_TypeConverter *converter) + nonnull(1); + /* * Nsf Cmd definition interface */ -EXTERN void Nsf_CmdDefinitionInit(Tcl_Interp *interp); -EXTERN Nsf_methodDefinition *Nsf_CmdDefinitionGet(Tcl_ObjCmdProc *proc); +EXTERN void Nsf_CmdDefinitionInit(Tcl_Interp *interp) + nonnull(1); +EXTERN Nsf_methodDefinition *Nsf_CmdDefinitionGet(Tcl_ObjCmdProc *proc) + nonnull(1); + #ifndef HAVE_STRNSTR char *strnstr(const char *buffer, const char *needle, size_t buffer_len); #endif