Index: generic/nsfInt.h =================================================================== diff -u -r9e00fd16244c59971f9d0ee692104eeba4be6cd0 -re1c25b411ed784b0f32610f04d2d7188f9cca418 --- generic/nsfInt.h (.../nsfInt.h) (revision 9e00fd16244c59971f9d0ee692104eeba4be6cd0) +++ generic/nsfInt.h (.../nsfInt.h) (revision e1c25b411ed784b0f32610f04d2d7188f9cca418) @@ -844,7 +844,33 @@ Tcl_HashTable objectData; Tcl_HashTable methodData; Tcl_HashTable procData; + int depth; } NsfProfile; + +# define NSF_PROFILE_CALL(interp, object, methodName) \ + if (RUNTIME_STATE(interp)->doTrace) { \ + Tcl_DString objectLabel; \ + NsfProfile *profilePtr = &RUNTIME_STATE(interp)->profile; \ +\ + profilePtr->depth ++; \ + NsfProfileObjectLabel(&objectLabel, (object), methodName); \ + NsfLog(interp, NSF_LOG_NOTICE, "call(%d): %s", profilePtr->depth, Tcl_DStringValue(&objectLabel));\ + Tcl_DStringFree(&objectLabel);\ + } +# define NSF_PROFILE_EXIT(interp, object, methodName) \ + if (RUNTIME_STATE(interp)->doTrace) { \ + Tcl_DString objectLabel; \ + NsfProfile *profilePtr = &RUNTIME_STATE(interp)->profile; \ + Tcl_Obj *resultObj = Tcl_GetObjResult(interp); INCR_REF_COUNT(resultObj); \ + profilePtr->depth --; \ + NsfProfileObjectLabel(&objectLabel, (object), methodName); \ + NsfLog(interp, NSF_LOG_NOTICE, "exit(%d): %s 0", profilePtr->depth, Tcl_DStringValue(&objectLabel));\ + Tcl_SetObjResult(interp, resultObj); DECR_REF_COUNT(resultObj); \ + Tcl_DStringFree(&objectLabel);\ + } +#else +# define NSF_PROFILE_CALL(interp, object, methodName) +# define NSF_PROFILE_EXIT(interp, object, methodName) #endif typedef struct NsfRuntimeState { @@ -886,6 +912,7 @@ int doFilters; int doKeepcmds; int doProfile; + int doTrace; int doSoftrecreate; /* keep track of defined filters */ Tcl_HashTable activeFilterTablePtr; @@ -975,6 +1002,8 @@ 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 void NsfProfileObjectLabel(Tcl_DString *dsPtr, NsfObject *obj, const char *methodName) + nonnull(1) nonnull(2) nonnull(3); EXTERN NsfCallStackContent *NsfCallStackGetTopFrame(Tcl_Interp *interp, Tcl_CallFrame **framePtrPtr) nonnull(1);